测试模版

入门

测试模板功能有助于将一些常见的测试和基础设施代码提取到可重用的组件中。特别是,它对于测试类层次结构很有用。

要创建测试模板,请将 @TestTemplate 宏放在抽象类上:

@TestTemplate abstract class DbTest { public prop dbConnection: DbConnection @TestCase func testCommonDbApi1() { /* ... */} @TestCase func testCommonDbApi2() { /* ... */} }

可用这个模板创建多个实际的测试套件,例如测试与不同特定数据库的连接。要使用测试模板,只需继承相应的类:

@Test class MySqlTest <: DbTest { var dbConnection_: ?DbConnection = None override prop dbConnection: DbConnection { get() { dbConnection_.getOrThrow() } } @BeforeAll func initializeConnection() { dbConnection_ = Some(...) } @AfterAll func closeConnection() { dbConnection_.close() } @TestCase func testSpecificlyMySqlFeatures() { /* ... */ } }

每个测试用例都将像在实际测试类本身中编写一样运行,结果如下:

------------------------------------------------------------ TP: default, time elapsed: 177679 ns, RESULT: TCS: MySqlTest, time elapsed: 157163 ns, RESULT: [ PASSED ] CASE: testCommonDbApi1 (34704 ns) [ PASSED ] CASE: testCommonDbApi2 (8480 ns) [ PASSED ] CASE: testSpecificlyMySqlFeatures (8329 ns) Summary: TOTAL: 3 PASSED: 3, SKIPPED: 0, ERROR: 0 FAILED: 0 ------------------------------------------------------------

测试模板本身可以由其他测试模板构建。

生命周期方法

测试模板还可以包含一些生命周期方法: @BeforeAll, @AfterAll, @BeforeEach, @AfterEach。生命周期方法按指定顺序执行:

  • @Before_ 生命周期方法按照从基类到继承类的顺序运行。
  • @After_ 生命周期方法按照从继承类到基类的顺序运行。

@_Each 派生类的方法也适用于基类的测试用例。

@TestTemplate abstract class BaseTemplate { @BeforeEach func baseBeforeEach() { println("base before each") } @AfterEach func baseAfterEach() { println("base after each") } } @TestTemplate abstract class Template <: BaseTemplate { @TestCase func templateCase() { println("template case") } } @Test class Test <: Template { @BeforeEach func beforeEach() { println("before each") } @AfterEach func afterEach() { println("after each") } @TestCase func testCase() { println("case") } }

输出将为(启用输出捕获时):

------------------------------------------------------------ TP: default, time elapsed: 456925 ns, RESULT: TCS: Test, time elapsed: 456925 ns, RESULT: [ PASSED ] CASE: templateCase (38228 ns) STDOUT: base before each before each template case after each base after each [ PASSED ] CASE: testCase (16098 ns) STDOUT: base before each before each case after each base after each Summary: TOTAL: 2 PASSED: 2, SKIPPED: 0, ERROR: 0 FAILED: 0 ------------------------------------------------------------

配置

@Configure 可以放置在测试模板类上,但是继承类的 @Configure 会覆盖为基类放置的值。所有测试用例都在合并后的配置下执行。

与其他特性交互的规则

  • @Parallel 不能与 @TestTemplate 同时使用。
  • @Types 不能与 @TestTemplate 同时使用。
  • @Bench 可在模版中使用, 在指定 --bench 时下执行,就像基准被放置在继承类本身中一样。