在所有测试运行后开玩笑清理

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 不需要导出任何内容。它将在每个测试套件(每个测试文件)之前执行。因为测试运行器已经初始化,像 beforeAllafterAll 这样的全局函数就像在你的常规测试文件中一样,所以你可以随意调用它们。

【讨论】:

选项“setupTestFrameworkScriptFile”替换为配置“setupFilesAfterEnv”,支持多路径。 我需要 globalTeardown(和 globalSetup),因为我需要在每次测试运行时启动和停止并行服务,而不是在每个测试套件之前或之后。

以上是关于在所有测试运行后开玩笑清理的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab - 开玩笑测试 - 分段错误(核心转储)

清理测试数据库,仅使用RSPEC和Capybara运行测试生成的数据

Unittest中TestCase类中定义的几个特殊方法

开玩笑单元测试返回“MongoError:拓扑被破坏”

Codeception 在 CEST 内的所有测试之前运行

开玩笑:测试套件无法运行,意外令牌 =