如何将全局变量传入含3个测试用例的测试套件及异步测试报错求解
测试问题解答
问题1:全局变量传入包含3个测试用例的单个测试套件的方法
- 若使用Jest、Mocha这类主流测试框架,直接在测试套件(
describe块)的顶层作用域定义变量即可,同套件下所有it测试用例都可以直接访问。如果需要提前初始化动态全局变量,结合beforeAll/beforeEach钩子赋值更稳妥,示例代码如下:
// 测试套件顶层定义静态全局变量 const globalTestConfig = { baseApi: 'http://127.0.0.1:8080', defaultUserToken: 'xxx_test_token_xxx' } // 定义动态全局变量,通过钩子赋值 let dynamicGlobalVal describe('目标测试套件', () => { beforeAll(() => { // 所有用例执行前赋值,3个用例都可访问该值 dynamicGlobalVal = '公共测试数据' }) it('测试用例1', () => { // 可直接读取globalTestConfig、dynamicGlobalVal }) it('测试用例2', () => { // 可直接读取两个全局变量 }) it('测试用例3', () => { // 可直接读取两个全局变量 }) })
- 若变量需要从框架配置侧统一传入,比如Jest可以在
jest.config.js的globals字段中配置,所有测试套件都可直接读取对应值。
问题2:删除功能测试报错解决建议
报错的根本原因是代码没有遵循异步回调的执行顺序:addPost、deletePost都是异步接口,你没有把后续逻辑嵌套到回调中执行,导致getById和done()执行时,addPost的回调还没触发,deleteSamplePost还是undefined,因此接口提示需要Post ID。
修正后的代码如下:
it('deletePost private post for current user',function(done){ Posts.addPost({postText : 'post for deleting purposes',isPublic : false},(err,resp) =>{ const deleteSamplePost = resp.id; console.log('delete',deleteSamplePost); // 拿到id后再执行删除操作 Posts.deletePost(deleteSamplePost, (err,r) => { expect(err).toEqual(null); // 删除完成后再执行查询验证 Posts.getById(deleteSamplePost,(err,re) => { expect(err).toEqual('Post not found'); expect(re).toEqual(undefined); // 所有异步逻辑执行完成后再调用done结束用例 done(); }); }); }); });
如果你的测试框架支持async/await语法,也可以改写为以下更易维护的形式,避免回调嵌套:
it('deletePost private post for current user', async function(){ // 新增帖子 const addResp = await Posts.addPost({postText : 'post for deleting purposes',isPublic : false}); const deleteSamplePost = addResp.id; // 执行删除 const deleteErr = await Posts.deletePost(deleteSamplePost); expect(deleteErr).toEqual(null); // 验证删除结果 const [getErr, getRes] = await Posts.getById(deleteSamplePost); // 可根据你的接口Promise封装格式调整返回值 expect(getErr).toEqual('Post not found'); expect(getRes).toEqual(undefined); });
内容的提问来源于stack exchange,提问作者nadiakhouri
相关产品推荐
相关产品推荐

