单元测试
测试 Sublime Text 软件包
详细信息
安装
- 总计 3K
- Win 1K
- Mac 881
- Linux 667
8月6日 | 8月5日 | 8月4日 | 8月3日 | 8月2日 | 8月1日 | 7月31日 | 7月30日 | 7月29日 | 7月28日 | 7月27日 | 7月26日 | 7月25日 | 7月24日 | 7月23日 | 7月22日 | 7月21日 | 7月20日 | 7月19日 | 7月18日 | 7月17日 | 7月16日 | 7月15日 | 7月14日 | 7月13日 | 7月12日 | 7月11日 | 7月10日 | 7月9日 | 7月8日 | 7月7日 | 7月6日 | 7月5日 | 7月4日 | 7月3日 | 7月2日 | 7月1日 | 6月30日 | 6月29日 | 6月28日 | 6月27日 | 6月26日 | 6月25日 | 6月24日 | 6月23日 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Windows | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Mac | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Linux | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
README
单元测试
这是一个用于 Sublime Text 的单元测试框架。它可以在本地机器和 GitHub Actions 上运行 unittest 测试用例。它还支持测试新 sublime-syntax 格式以及 sublime-color-scheme 文件。
Sublime Text 4
现在支持 Sublime Text 4,测试对 Python 3.8 软件包有效。
准备
- 通过 Package Control 安装 单元测试。
- 您的软件包!
- 测试用例应放置在
tests
目录(可配置,见下文)下的test*.py
下。测试用例随后将由 TestLoader.discover 加载。
这里有一些小示例
本地运行测试
命令面板
- 使用 ctrl+shift+P 或菜单项
工具 → 命令面板...
打开命令面板
- 选择一个
单元测试:
命令并按 Enter
测试任何软件包...
- 运行
单元测试:测试软件包
- 在输入面板中键入软件包名称并按Enter。
弹出一个输出面板,显示测试进度和结果。
要仅测试特定文件中的测试,输入 <Package name>:<filename>
。其中 <filename>
应该是一个 unix shell 通配符以匹配文件名。默认使用 <Package name>:test*.py
。
命令 单元测试:测试当前软件包
运行当前软件包中所有测试。软件包重新加载以获取任何代码更改,然后执行测试。
命令 单元测试:使用覆盖运行当前软件包的测试
运行当前软件包的测试并通过 覆盖率 生成覆盖率报告。使用 .coveragerc 文件来控制覆盖率配置。如果缺失,单元测试将忽略 tests
目录。
[!注意]
从Unittesting 1.8.0版本开始,以下命令已被替换,以实现更灵活的使用并进行构建系统的集成。
unit_testing_current_package
{ "command": "unit_testing", "package": "$package_name" }unit_testing_current_file
{ "command": "unit_testing", "package": "$package_name", "pattern": "$file_name" }
构建系统
要通过构建系统运行测试,请指定构建系统unit_testing
的"target"
。
{
"target": "unit_testing"
}
项目特定的测试当前包
构建命令
建议将以下内容添加到.sublime-project文件中,以便按ctrl+b执行测试操作。
"build_systems":
[
{
"name": "Test Current Package",
"target": "unit_testing",
"package": "$package_name",
"failfast": true
}
]
项目特定的测试当前文件
构建命令
建议将以下内容添加到.sublime-project文件中,以便按ctrl+b执行测试操作。
"build_systems":
[
{
"name": "Test Current File",
"target": "unit_testing",
"package": "$package_name",
"pattern": "$file_name",
"failfast": true
}
]
GitHub Actions
Unittesting提供了以下GitHub Actions,可以组合到工作流程中设计包测试。
- SublimeText/UnitTesting/actions/setup
设置Sublime Text以运行测试。
在检出要测试的包之后,这必须始终是第一步。
- SublimeText/UnitTesting/actions/run-color-scheme-tests
使用ColorSchemeUnit测试颜色方案。
- SublimeText/UnitTesting/actions/run-syntax-tests
使用已运行的Sublime Text环境的内置语法测试函数测试sublime-syntax定义。
这是SublimeText/syntax-test-action或sublimehq的在线syntest_runner的替代方案。
- SublimeText/UnitTesting/actions/run-tests
运行unit_testing
命令以执行Python单元测试。
[!注意]
操作在分支
v1
上发布。除非有破坏性更改,否则较小更改将推送到同一分支。
颜色方案测试
要通过ColorSchemeUnit集成颜色方案测试,请将以下代码片段添加到一个工作流程文件中(例如,.github/workflows/color-scheme-tests.yml
)。
name: ci-color-scheme-tests
on: [push, pull_request]
jobs:
run-syntax-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: SublimeText/UnitTesting/actions/setup@v1
- uses: SublimeText/UnitTesting/actions/run-color-scheme-tests@v1
语法测试
要仅运行语法测试,请将以下代码片段添加到一个工作流程文件中(例如,.github/workflows/syntax-tests.yml
)。
name: ci-syntax-tests
on: [push, pull_request]
jobs:
run-syntax-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: SublimeText/UnitTesting/actions/setup@v1
- uses: SublimeText/UnitTesting/actions/run-syntax-tests@v1
[!注意]
如果您只需要语法测试,也可以查看SublimeText/syntax-test-action。使用此测试的最佳方式是复用已设置的ST测试环境。
单元测试
要运行所有平台和Sublime Text版本的Python单元测试,请将以下代码片段添加到一个工作流程文件中(例如,.github/workflows/unit-tests.yml
)。
name: ci-unit-tests
on: [push, pull_request]
jobs:
run-tests:
strategy:
fail-fast: false
matrix:
st-version: [3, 4]
os: ["ubuntu-latest", "macOS-latest", "windows-latest"]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: SublimeText/UnitTesting/actions/setup@v1
with:
package-name: Package Name # if differs from repo name
sublime-text-version: ${{ matrix.st-version }}
- uses: SublimeText/UnitTesting/actions/run-tests@v1
with:
coverage: true
package-name: Package Name # if differs from repo name
- uses: codecov/codecov-action@v4
运行全部测试
name: ci-tests
on: [push, pull_request]
jobs:
run-tests:
strategy:
fail-fast: false
matrix:
st-version: [3, 4]
os: ["ubuntu-latest", "macOS-latest", "windows-latest"]
runs-on: ${{ matrix.os }}
steps:
# checkout package to test
- uses: actions/checkout@v4
# setup test environment
- uses: SublimeText/UnitTesting/actions/setup@v1
with:
sublime-text-version: ${{ matrix.st-version }}
# run color scheme tests (only on Linux)
- if: ${{ matrix.os == 'ubuntu-latest' }}
uses: SublimeText/UnitTesting/actions/run-color-scheme-tests@v1
# run syntax tests and check compatibility with new syntax engine (only on Linux)
- if: ${{ matrix.os == 'ubuntu-latest' }}
uses: SublimeText/UnitTesting/actions/run-syntax-tests@v1
with:
compatibility: true
# run unit tests with coverage upload
- uses: SublimeText/UnitTesting/actions/run-tests@v1
with:
coverage: true
extra-packages: |
A File Icon:SublimeText/AFileIcon
- uses: codecov/codecov-action@v4
请参阅此处以获取更多示例。
选项
包配置
UnitTesting主要由包根目录中的unittesting.json
文件配置。
{
"verbosity": 1,
"coverage": true
}
构建系统配置
通过构建系统配置提供的选项将覆盖unittesting.json
。
{
"target": "unit_testing",
"package": "$package_name",
"verbosity": 2,
"coverage": true
}
命令参数
传递到unit_testing
命令的选项将覆盖unittesting.json
。
window.run_command("unit_testing", {"package": "$package_name", "coverage": False})
可用选项
name | description | default value |
---|---|---|
tests_dir | 包含测试的目录名称 | “tests” |
pattern | 发现测试的模式 | “test*.py” |
deferred | 是否使用延迟测试运行器 | true |
condition_timeout | 通过yield 调用时可调用者的默认超时时间(毫秒) |
4000 |
failfast | 如有测试失败则早早停止 | false |
output | 测试输出的名称,而不是显示在面板中 in the panel |
null |
verbosity | 冗余级别 | 2 |
warnings | 警告过滤器控制Python警告的处理。 | “default” |
capture_console | 在测试输出中捕获stdout和stderr | false |
reload_package_on_testing | 重新加载包将增加覆盖率率 | true |
coverage | 跟踪测试用例覆盖率 | false |
coverage_on_worker_thread | (实验性) | false |
generate_html_report | 为覆盖率生成HTML报告 | false |
generate_xml_report | 为覆盖率生成XML报告 | false |
有效的warnings
值是
值 | 处理 |
---|---|
“default” | 对于每个发生警告的位置(模块 + 行号),打印第一个匹配警告的出现 |
“错误” | 将匹配警告转换为异常 |
“忽略” | 永远不打印匹配警告 |
“总是” | 总是打印匹配警告 |
“模块” | 对于每个发生警告的模块,打印第一个匹配警告的出现(无论行号) |
“一次” | 无论位置,只打印首次出现的匹配警告 |
参见:[Python官方文档](https://docs.pythonlang.cn/3/library/warnings.html#warning-filter)
编写单元测试
单元测试是基于python的unittest
库。任何有效且合规的unittest测试用例都是允许的。
示例
tests/test_myunit.py
from unittest import TestCase
class MyTestCase(TestCase):
def test_something(self):
self.assertTrue(True)
延迟测试
可以使用可延迟的测试用例来编写测试异步或长时间运行的sublime命令的结果的测试,这些命令需要将控制权交给sublime text运行时,并在稍后重新启动测试执行。
这是一种类似于asyncio
提供的协作多线程,但它有一个自制的DeferringTextTestRunner作为事件循环。
这个想法受到了插件单元测试框架的启发。
DeferrableTestCase用于编写测试用例。它们由DeferringTextTestRunner执行,且运行预期不仅是常规的测试函数,还有生成器。如果测试函数是生成器,它会做以下操作
- 如果产生的对象是可调用的,则运行器会评估可调用并检查其返回值。如果不是
None
,则运行器将延续生成器;如果不是,运行器将等待直到条件满足,默认的超时时间为4秒。可调用的结果也可以从yield
语句中检索。产生的对象也可以是以下形式的字典
{
# required condition callable
"condition": callable,
# system timestamp when to start condition checks (default: `time.time()`)
"start_time": timestamp,
# optional the interval to invoke `condition()` (default: 17)
"period": milliseconds,
# optional timeout to wait for condition to be met (default: value from unittesting.json or 4000)
"timeout": milliseconds,
# optional message to print, if condition is not met within timeout
"timeout_message": "Condition not fulfilled"
}
以指定各种覆盖,如轮询间隔或毫秒中的超时。
如果产生的对象是整数,比如
x
,那么它将在x
毫秒后继续
生成器。yield AWAIT_WORKER
会将控制权交给工作线程中的任务。否则,单个
yield
会将控制权交给主线程中的任务。
示例
import sublime
from unittesting import DeferrableTestCase
class TestCondition(DeferrableTestCase):
def test_condition1(self):
x = []
def append():
x.append(1)
def condition():
return len(x) == 1
sublime.set_timeout(append, 100)
# wait until `condition()` is true
yield condition
self.assertEqual(x[0], 1)
def test_condition2(self):
x = []
def append():
x.append(1)
def condition():
return len(x) == 1
sublime.set_timeout(append, 100)
# wait until `condition()` is true
yield {
"condition": condition,
"period": 200,
"timeout": 5000,
"timeout_message": "Not enough items added to x"
}
self.assertEqual(x[0], 1)
另外参见tests/test_defer.py。
辅助测试用例
UnitTesting提供了某些辅助测试用例类,这些类执行一些常见任务,如覆盖首选项、设置视图等。
- DeferrableViewTestCase
- OverridePreferencesTestCase
- TempDirectoryTestCase
- ViewTestCase
使用方法和一些示例在文档字符串中提供,这些文档字符串由LSP和例如LSP-pyright显示为悬停弹出。
鸣谢
感谢guillermooo和philippotto为他们的早期努力在AppVeyor和Travis CI macOS支持(尽管这些服务现在不受支持)。