测试工具
简介
KCL 支持通过内置的 kcl-test 命令行工具和 testing 包提供了简易的测试框架。每个目录下的全部 KCL 文件是一个测试整体,每个 _test.k 中 Test 开头的 schema 是一个测试案例。
使用方式
假设有 hello.k 文件,代码如下:
schema Person:
    name: str = "kcl"
    age: int = 1
hello = Person {
    name = "hello kcl"
    age = 102
}
构造 hello_test.k 测试文件,内容如下:
schema TestPerson:
    a = Person{}
    assert a.name == 'kcl'
schema TestPerson_age:
    a = Person{}
    assert a.age == 1
schema TestPerson_ok:
    a = Person{}
    assert a.name == "kcl"
    assert a.age == 1
然后再目录下执行 kcl-test 命令:
$ kcl-test
ok   /pkg/to/app [365.154142ms]
$ 
失败的测试
将 hello_test.k 测试代码修改如下,构造失败的测试:
# Copyright 2021 The KCL Authors. All rights reserved.
import testing
schema TestPerson:
    a = Person{}
    assert a.name == 'kcl2'
schema TestPerson_age:
    a = Person{}
    assert a.age == 123
schema TestPerson_ok:
    a = Person{}
    assert a.name == "kcl2"
    assert a.age == 1
测试输出的错误如下:
$ kcl-test
FAIL /pkg/to/app [354.153775ms]
---- <TestPerson> failed [48.817552ms]
     KCL Runtime Error: File /pkg/to/app/hello_test.k:7:
             assert a.name == 'kcl2'
     Assertion failure
---- <TestPerson_age> failed [47.515009ms]
     KCL Runtime Error: File /pkg/to/app/hello_test.k:11:
             assert a.age == 123
     Assertion failure
---- <TestPerson_ok> failed [47.26677ms]
     KCL Runtime Error: File /pkg/to/app/hello_test.k:15:
             assert a.name == "kcl2"
     Assertion failure
$
配置 option 参数
可以通过 testing 包指定面值类型的命令行参数:
schema TestOptions:
    testing.arguments("name", "ktest")
    testing.arguments("age", "123")
    testing.arguments("int0", 0)
    testing.arguments("float0", 0.0)
    testing.arguments("bool-true", True)
    testing.arguments("bool-false", False)
    name = option("name")
    assert name == "ktest"
    age = option("age")
    assert age == 123
    assert option("int0") == 0
    assert option("float0") == 0.0
    assert option("bool-true") == True
    assert option("bool-false") == False
其中 testing.arguments 定义一组 key-value 参数,只有在当前的测试中有效。
option 参数也可以从 settings.yaml 文件读取。假设有 ./settings.yaml 文件如下:
  - key: app-name
    value: app
  - key: env-type
    value: prod
  - key: image
    value: reg.docker.inc.com/test-image
然后可以通过 testing.setting_file("./settings.yaml") 方式配置参数。同时依然支持 testing.arguments() 覆盖配置文件中的参数:
schema TestOptions_setting:
    testing.setting_file("./settings.yaml")
    testing.arguments("file", "settings.yaml")
    assert option("app-name") == "app"
    assert option("file") == "settings.yaml"
testing.setting_file("settings.yaml") 则是从 yaml 文件加载对应的 key-value 参数。
测试插件
如果要测试的目录含有 plugin.py 和测试文件,自动切换到插件模式。那么将测试前设置 KCL_PLUGINS_ROOT 环境变量(不能再访问其他目录的插件)用于测试当前插件,测试完成之后恢复之前的 KCL_PLUGINS_ROOT 环境变量。
集成测试
目录含有 *.k 时自动执行集成测试,如果有 stdout.golden 则验证输出的结果,如果有 stderr.golden 则验证错误。支持 settings.yaml 文件定义命令行参数。
如果有 k 文件含有 # kcl-test: ignore 标注注释将忽略测试。
批量测试
kcl-test path执行指定目录的测试, 当前目录可以省略该参数kcl-test -run=regexp可以执行匹配模式的测试kcl-test ./...递归执行子目录的单元测试
命令行参数
$ kcl-test -h
NAME:
   kcl-go test - test packages
USAGE:
   kcl-go test [command options] [packages]
OPTIONS:
   --run value    Run only those tests matching the regular expression.
   --quiet, -q    Set quiet mode (default: false)
   --verbose, -v  Log all tests as they are run (default: false)
   --debug, -d    Run in debug mode (for developers only) (default: false)
   --help, -h     show help (default: false)