You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何控制Detox测试执行顺序,确保A.e2e.ts先于B.e2e.ts运行且保留应用实例?

确保Detox测试按指定顺序执行且保留应用实例的方案

方案一:修复自定义Jest测试排序器的配置

你之前实现的sequencer没生效,大概率是配置环节出了问题,按以下步骤排查修复:

  1. 编写正确的排序器代码(以TypeScript为例):
// custom-test-sequencer.ts
import { Test } from '@jest/test-result';
import DefaultSequencer from '@jest/test-sequencer';

class CustomSequencer extends DefaultSequencer {
  sort(tests: Test[]): Test[] {
    // 定义测试文件的执行顺序
    const desiredOrder = ['A.e2e.ts', 'B.e2e.ts'];
    return tests.sort((testA, testB) => {
      const fileNameA = testA.path.split('/').pop()!;
      const fileNameB = testB.path.split('/').pop()!;
      return desiredOrder.indexOf(fileNameA) - desiredOrder.indexOf(fileNameB);
    });
  }
}

export default CustomSequencer;
  1. 在Jest/Detox配置文件中指定排序器:
    在jest.config.js或detox.config.js里添加以下配置:
module.exports = {
  // 其他已有配置
  testSequencer: '<rootDir>/custom-test-sequencer.ts',
};
  1. 版本兼容性检查:如果使用Detox 20+,需确保Jest版本在28以上,避免API不兼容导致排序器失效。

方案二:合并测试文件,拆分测试套件(最稳妥)

如果排序器始终无法生效,直接将A和B的测试逻辑合并到同一个文件中,利用Detox在单个文件内保持应用实例的特性,通过describe分组控制执行顺序:

// combined-tests.e2e.ts
describe('完整测试流程', () => {
  beforeAll(async () => {
    // 初始化应用,对应A文件的前置操作
    await device.launchApp();
    await element(by.id('initial-setup')).tap();
    // ...其他A文件中的初始化步骤
  });

  describe('A模块测试', () => {
    it('完成A的核心操作', async () => {
      // 原A.e2e.ts中的测试逻辑
      await element(by.id('action-A')).tap();
      await expect(element(by.id('status-A-done'))).toBeVisible();
    });
  });

  describe('B模块测试', () => {
    it('基于A的结果执行B操作', async () => {
      // 原B.e2e.ts中的测试逻辑,此时应用状态为A执行后的状态
      await element(by.id('action-B')).tap();
      await expect(element(by.id('status-B-done'))).toBeVisible();
    });
  });
});

这种方式不需要依赖任何外部排序逻辑,Detox会在整个文件的所有测试执行完毕后才销毁应用实例,完全符合CI环境的要求,也是官方推荐的跨测试用例保持状态的方案。

方案三:抽离公共逻辑,配合测试钩子共享状态

如果不想合并文件,可以将A的核心操作抽成公共函数,在B的测试钩子中复用,同时配置Detox禁用自动重启应用:

  1. 抽离公共操作函数:
// test-utils.ts
export const executeASteps = async () => {
  // 原A.e2e.ts中的核心操作逻辑
  await element(by.id('login-input')).typeText('test-user');
  await element(by.id('login-submit')).tap();
};
  1. 修改Detox配置,禁用单文件重启:
    在detox.config.js中对应配置项里添加reuse: true(仅配置层面,不用命令行参数):
module.exports = {
  configurations: {
    ios: {
      // 其他已有配置
      reuse: true,
    },
    android: {
      // 其他已有配置
      reuse: true,
    },
  },
};
  1. 在A文件中执行初始化:
// A.e2e.ts
import { executeASteps } from './test-utils';

describe('A模块', () => {
  beforeAll(async () => {
    await device.launchApp();
  });

  it('执行A操作', async () => {
    await executeASteps();
  });
});
  1. 在B文件中复用A的状态:
// B.e2e.ts
import { executeASteps } from './test-utils';

describe('B模块', () => {
  beforeAll(async () => {
    const appIsRunning = await device.isAppRunning();
    if (!appIsRunning) {
      await device.launchApp();
      await executeASteps();
    }
  });

  it('基于A结果执行B操作', async () => {
    // 原B.e2e.ts中的测试逻辑
  });
});

此时需要确保CI命令中按顺序执行文件:detox test A.e2e.ts B.e2e.ts --configuration <your-config>,保证A先执行,B复用其应用状态。


内容的提问来源于stack exchange,提问作者crevulus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:41:29