ctrl+shift+p filters: :st2 :st3 :win :osx :linux
浏览

单元测试

作者 SublimeText ALL

测试 Sublime Text 软件包

详细信息

  • 1.8.2
    0.10.6
  • github.com
  • github.com
  • 1个月前
  • 29分钟前
  • 10年前

安装

  • 总计 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

源代码
raw.githubusercontent.com

单元测试

test codecov

这是一个用于 Sublime Text 的单元测试框架。它可以在本地机器和 GitHub Actions 上运行 unittest 测试用例。它还支持测试新 sublime-syntax 格式以及 sublime-color-scheme 文件。

Sublime Text 4

现在支持 Sublime Text 4,测试对 Python 3.8 软件包有效。

准备

  1. 通过 Package Control 安装 单元测试
  2. 您的软件包!
  3. 测试用例应放置在 tests 目录(可配置,见下文)下的 test*.py 下。测试用例随后将由 TestLoader.discover 加载。

这里有一些小示例

本地运行测试

命令面板

  1. 使用 ctrl+shift+P 或菜单项 工具 → 命令面板... 打开 命令面板
  2. 选择一个 单元测试: 命令并按 Enter

测试任何软件包...

  1. 运行 单元测试:测试软件包
  2. 在输入面板中键入软件包名称并按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,可以组合到工作流程中设计包测试。

  1. SublimeText/UnitTesting/actions/setup

设置Sublime Text以运行测试。

在检出要测试的包之后,这必须始终是第一步。

  1. SublimeText/UnitTesting/actions/run-color-scheme-tests

使用ColorSchemeUnit测试颜色方案。

  1. SublimeText/UnitTesting/actions/run-syntax-tests

使用已运行的Sublime Text环境的内置语法测试函数测试sublime-syntax定义。

这是SublimeText/syntax-test-action或sublimehq的在线syntest_runner的替代方案。

  1. 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显示为悬停弹出。

鸣谢

感谢guillermooophilippotto为他们的早期努力在AppVeyor和Travis CI macOS支持(尽管这些服务现在不受支持)。