通常情况下,您需要在每次测试后进行某种清理。例如,清理数据库。
问题:
使用 unittest 库时,有没有办法附加全局 tearDown 和 setUp 函数?能够围绕建议进行定义会更好:
unittest.around((test){
//doing setup
test();
//doing cleanup
});
通常情况下,您需要在每次测试后进行某种清理。例如,清理数据库。
问题:
使用 unittest 库时,有没有办法附加全局 tearDown 和 setUp 函数?能够围绕建议进行定义会更好:
unittest.around((test){
//doing setup
test();
//doing cleanup
});
您可以手动完成,正如 Gram 在 bug 中提到的那样:
main() {
topSetup() {
// ...
}
setUp(topSetup);
group('group', () {
setUp(() {
topSetup();
// ...
});
test('test', () {
// ...
});
});
}
当然,这个bug需要先修复:-)
然后你会像贾斯汀所说的那样使用可以显式调用的非匿名函数来执行此操作。在我看来,这是提供最大灵活性的最佳方式,而无需使用大量复杂的设置/拆卸逻辑来妨碍单元测试库。
如果您想进行测试套件设置/拆卸,您可以在组中使用初始/最终“测试”来执行此操作:
group('test suite', () {
test('Set up suite', () { ... });
test('Test 1', () { ... });
...
test('Test n', () { ... });
test('Tear down suite', () { ... });
});
这并不理想,但它是一个解决方案。
值得指出的是,在内部,组实际上并不表示为层次结构。我们真正要做的就是与当前的 setUp/tearDown 函数保持一个堆栈,这样我们就可以将每个测试用例与适当的测试用例相关联,并将组名和测试名连接起来以形成测试用例的最终名称。我们没有构建树形数据结构,因此我们没有一种隐式执行向上调用的好方法(我们可以动态创建调用一个级别的闭包,并将它们用作实际的 setUp/tearDown 函数,但这有点丑陋)。