在所有测试运行后开玩笑清理
Posted
技术标签:
【中文标题】在所有测试运行后开玩笑清理【英文标题】:Jest clean up after all tests have run 【发布时间】:2017-05-10 00:32:50 【问题描述】:是否可以在 Jest 中运行在所有其他测试完成后运行的清理或拆卸任务?类似于 setupFiles 允许在任何测试运行之前设置任务的方式。如果无论测试是否有任何错误,它也可以运行,则加分。
将afterAll(() => )
放在文件的顶层(在任何描述函数之外)似乎只会在该特定文件的测试完成后运行。
用例是我有许多测试文件将在开发数据库中创建用户,我不想让每个测试文件负责清理和删除用户之后。编写测试时也可能发生错误,因此如果不管错误如何都发生清理,那将是更可取的。
【问题讨论】:
我认为每个测试都必须完全控制环境,因此每个测试都必须对其环境负责。也许您需要拥有多个环境,例如一个可以在内存中运行(使用数据库的模拟实现),而另一个可以真正与数据库一起运行。 你能在你的测试运行器中添加一个清理命令吗?即,如果您使用 gulp、make、grunt 等:run_your_tests.js; clean_up_database;
【参考方案1】:
似乎有一个名为 reporter 的功能正是这样做的:
【讨论】:
在这种情况下,安装文件会更相关恕我直言【参考方案2】:要在所有测试套件完成后执行某些任务,请使用 globalTeardown。示例:
在 package.json 中:
"jest":
"globalTeardown": "<rootDir>/teardownJest.js"
,
在teardownJest.js中:
const teardown = async () =>
console.log('called after all test suites');
module.exports = teardown;
请记住,jest 从头开始为每个测试套件和拆卸文件导入每个模块。来自official documentation:
默认情况下,每个测试文件都有自己独立的模块注册表
因此,您不能为每个测试套件或拆卸文件共享相同的数据库模块实例。因此,如果你想在所有测试服之后关闭数据库连接,这种方法是行不通的
【讨论】:
【参考方案3】:在jest.config.js
:
module.exports =
// ...
setupFilesAfterEnv: [
"./test/setup.js",
// can have more setup files here
],
在./test/setup.js
:
afterAll(() => // or: afterAll(async () => ); to support await calls
// Cleanup logic
);
注意:
我正在使用 Jest 24.8 参考: setupFilesAfterEnv【讨论】:
【参考方案4】:setupFiles
有一个兄弟钩子,它会在每个测试套件之前但在您的测试运行器(默认为 Jasmine2)初始化全局环境之后立即触发。
它叫做setupFilesAfterEnv
。像这样使用它:
"setupFilesAfterEnv": ["<rootDir>/setup.js"]
示例setup.js:
beforeAll(() => console.log('beforeAll'));
afterAll(() => console.log('afterAll'));
setup.js
不需要导出任何内容。它将在每个测试套件(每个测试文件)之前执行。因为测试运行器已经初始化,像 beforeAll
和 afterAll
这样的全局函数就像在你的常规测试文件中一样,所以你可以随意调用它们。
【讨论】:
选项“setupTestFrameworkScriptFile”替换为配置“setupFilesAfterEnv”,支持多路径。 我需要 globalTeardown(和 globalSetup),因为我需要在每次测试运行时启动和停止并行服务,而不是在每个测试套件之前或之后。以上是关于在所有测试运行后开玩笑清理的主要内容,如果未能解决你的问题,请参考以下文章