测试运行时向global对象添加字段在teardown中未生效的问题求助
问题原因
核心问题在于测试用例的执行上下文与global-setup/teardown的上下文不共享Node.js的global对象。
以Jest这类主流测试框架为例,global-setup和global-teardown运行在主进程中,而每个测试用例是在独立的子进程(或隔离VM上下文)里执行的。你在测试用例catch块中修改的global.sometwo,只是子进程内的局部global变量,主进程的global-teardown完全访问不到;而global-setup里的global.someone能被测试用例读取,是因为测试框架会主动把主进程的部分global数据同步到子进程,但反向同步不存在。
解决方案1:使用测试框架的全局状态存储(以Jest为例)
这是官方推荐的跨上下文共享数据的方式,利用框架提供的globalState实现数据传递:
修改global-setup.ts
module.exports = async (config, projectConfig) => { // 将数据存入全局状态 config.globalState.set('someone', 1); };
修改testfile.test.ts
describe('sometitle', ()=>{ test('testTitle', () => { try{ // 从全局状态读取数据 console.log(global.jest.globalState.get('someone')); // 1 expect(false).toBe(true); } catch (e) { // 将数据写入全局状态 global.jest.globalState.set('sometwo', 2); throw(e); } }) })
修改global-teardown.ts
module.exports = async function (globalConfig, projectConfig) { // 从全局状态读取数据 console.log(globalConfig.globalState.get('someone')); // 1 console.log(globalConfig.globalState.get('sometwo')); // 2 }
解决方案2:使用文件存储临时数据
如果你的测试框架不支持全局状态,可以通过本地文件中转数据:
修改testfile.test.ts
const fs = require('fs').promises; const path = require('path'); describe('sometitle', ()=>{ test('testTitle', async () => { try{ console.log(global.someone); // 1 expect(false).toBe(true); } catch (e) { // 将数据写入临时文件 await fs.writeFile(path.join(__dirname, 'temp-test-data.json'), JSON.stringify({sometwo: 2})); throw(e); } }) })
修改global-teardown.ts
const fs = require('fs').promises; const path = require('path'); module.exports = async function (globalConfig, projectConfig) { console.log(global.someone); // 1 // 从临时文件读取数据 const tempData = JSON.parse(await fs.readFile(path.join(__dirname, 'temp-test-data.json'), 'utf8')); console.log(tempData.sometwo); // 2 // 清理临时文件 await fs.unlink(path.join(__dirname, 'temp-test-data.json')); }
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

