Jest全局变量的持久化

16
我看到可以在Jest测试中指定全局变量,但是:

对于其他测试文件,更改不会在测试运行之间保留。

是否有办法对全局变量进行更改,使其在所有测试文件中都持久存在?


请看链接:https://dev59.com/cVUL5IYBdhLWcg3waHRw#52910794 - Ore4444
1
我没有找到任何可以在不同测试文件之间持久化的东西,只能在每个测试文件内的测试之间持久化。您可以在 package.jsonjest 键中使用 globals 或设置一个 ENV 变量,但是对这些变量的任何修改都不会在测试文件之间持久化。如果我错了,请纠正我。 - Joshua Pinter
2个回答

4
您可以使用“环境变量”来在多个测试文件中传递这些变量,即使有多个测试文件。 官方文档 指出,任何全局变量都不能通过测试访问:
注意:通过globalSetup定义的任何全局变量只能在globalTeardown中读取。您无法在测试套件中检索此处定义的全局变量。
但是,测试使用相同的环境,因此您可以相应地设置和更改变量。
  1. Create globalSetup in config with following file:

     // setup.js
     module.exports = async () => {
       process.env.TEST_VAR = "my-test-var";
     };
    
  2. You can use this variable in your tests:

     // 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. You can unset this variable ones the test are complete with globalTeardown config with the following file:

      // teardown.js
      module.exports = async () => {
        delete process.env.TEST_VAR;
      };
    
记住,设置和不正确使用环境变量是有风险的,可能会改变您的测试结果。我使用它来传递一个持久的变量。

2
我认为没有办法做到这一点。我也认为不应该有这样的方法。测试用例应该能够独立运行。允许对全局变量进行某些变异以在所有测试文件中保持持久性可能会导致一个测试用例只有在另一个测试用例修改了某个变量后才能成功。这种情况可能会导致非常脆弱的测试,并应该避免。
如果您需要全局变量(或任何其他变量)处于某种状态以使测试成功,您应该查看Jest的设置和拆卸方法。

感谢@stijndepestel的回复。我希望收集每次测试运行的性能测量数据,并将这些数据保存以便在测试套件之间进行比较。我猜我可以直接写入文件。 - cham
1
我想在一个软件上运行集成测试,但这个软件太大了,在每个测试套件之前和之后快速启动和关闭它并不现实。相反,我想为每个测试套件创建一个不同的用户,并使用不同的用户名测试同一实例。为此,共享全局计数器(user0、user1等)将非常有帮助。你在上面做了很多猜测,认为测试套件彼此依赖并因为存在共享上下文而变得脆弱。 - Benni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接