【问题标题】:Jest global variables that persistJest 持续存在的全局变量
【发布时间】:2018-07-12 11:47:21
【问题描述】:

我看到 global variables 可以在 Jest 测试中指定,但是:

变异不会在其他测试文件的测试运行中持续存在。

有没有办法对在所有测试文件中持续存在的全局变量进行更改?

【问题讨论】:

  • 我没有发现任何会在不同的测试文件中持续存在的东西,只有在每个测试文件内的测试之间。您可以在jestpackage.json 键中使用globals,或者您可以设置一个ENV 变量,但您对这些变量所做的任何修改都不会在测试文件之间保留。如果我错了,请纠正我。

标签: jestjs


【解决方案1】:

我认为没有办法做到这一点。我也不认为应该有办法做到这一点。测试用例应该能够彼此独立运行。允许对全局变量的某些突变在所有测试文件中持久存在可能会产生这样一种情况,即只有在另一个测试用例改变了某个变量之后运行测试用例才会成功。这种情况可能会导致测试非常脆弱,应该避免。

如果您需要全局变量(或任何其他变量)处于特定状态以使测试成功。您应该查看 Jest 的 setup and teardown 方法。

【讨论】:

  • 感谢@stijndepestel 的回复。我希望在每次测试运行时收集性能测量值,并保留这些测量值以在测试套件之间进行比较。我想我可以只写一个文件。
  • 我想在一个软件上运行集成测试,该软件太大而无法在每个测试套件之前快速启动并在每个测试套件之后停止,以便测试彼此独立。相反,我想为每个测试套件创建一个不同的用户,并使用不同的用户名测试同一个实例。为此,共享一个全局计数器(user0、user1 等)将非常有帮助。您在那里做了很多猜测,假设测试套件相互依赖并且因为存在共享上下文而变得脆弱。
【解决方案2】:

即使您有多个测试文件,您也可以使用Environment Variables 在测试中携带这些变量。 Official docs 在下面声明任何全局变量都不能通过测试访问:

注意:任何通过 globalSetup 定义的全局变量只能在 globalTeardown 中读取。您无法检索在您的测试套件中定义的全局变量。

但测试使用相同的环境,因此您可以相应地设置和更改变量。

  1. 使用以下文件在配置中创建globalSetup

     // setup.js
     module.exports = async () => {
       process.env.TEST_VAR = "my-test-var";
     };
    
  2. 您可以在测试中使用此变量:

     // my-test.js
     // ...
     it("should read the test var from environment", async (done) => {
       expect(process.env.TEST_VAR).toEqual("my-test-var");
       process.env.TEST_VAR = "new-var";
       expect(process.env.TEST_VAR).toEqual("new-var");
     done();
     });
     // ...
    
  3. 您可以使用globalTeardown config 使用以下文件取消设置此变量:

      // teardown.js
      module.exports = async () => {
        delete process.env.TEST_VAR;
      };
    

请记住,设置环境变量而不正确使用环境变量是有风险的,可能会改变您的测试结果。我用它来传递一个持久变量。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2016-05-28
    • 1970-01-01
    • 2022-06-16
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多