如何基于配置文件跳过Cucumber中无需执行的测试场景
问题:数据迁移测试如何基于配置自动跳过未配置的场景
我们有一套数据迁移系统,可将不同源端的数据迁移到目标端,例如从Oracle到Db2、从Postgres到Kafka、从MySQL到Hadoop等。
我们的feature文件中包含如下逻辑:
Scenario: Test data migraiton Given I have the following source to target mapping | source | target | | Oracle | Db2 | | Postgres | Kafka | | MySql | Hadoop | When I try to run migration basic test Then I get abc ... Then I get xyz
如果用户新增了Oracle源端相关代码,在代码合入前不需要运行全量测试套件。因此我们计划所有用户共用同一份feature文件,提供配置文件供用户调整需关注的数据库,仅运行对应数据库的测试。
配置文件示例如下:
books: Oracle: credentials:<database credentials> url:<url> Db2: credentials:<database credentials> url:<url>
注意:上述示例配置缺少Kafka、Hadoop、MySQL、Postgres的相关信息。
而构建系统需要运行全量测试套件,使用完整的configuration.yaml文件即可满足该需求。
我们希望找到高效的实现方案,不需要到处添加if判断校验当前{source,target}组合是否在configuration.yaml中定义,若未定义则跳过对应组合的测试。
解决方案
你这个场景通过改造基础步骤的底层逻辑即可实现,完全不需要在业务测试代码中添加冗余判断,具体实现如下:
核心实现方案
- 不需要修改现有Feature文件内容,仅调整
I have the following source to target mapping这个公共步骤的实现逻辑:- 步骤执行前优先加载当前环境的
configuration.yaml配置,提取books节点下所有已配置的数据库名称集合 - 遍历Feature文件中传入的源目映射表,仅保留
source和target都属于上述已配置数据库集合的组合 - 将过滤后的有效组合存入测试上下文,后续的
When、Then步骤仅针对这些有效组合循环执行
- 步骤执行前优先加载当前环境的
- 配置适配逻辑天然满足不同场景需求:
- 开发人员本地测试时,仅在配置文件中保留自己需要测试的数据库信息,过滤后只会执行对应源目组合的测试
- 构建系统执行全量测试时,使用包含所有数据库配置的完整yaml文件,所有源目组合都会被保留,自动执行全量测试
可选优化(适配单端改动测试)
如果需要支持仅测试单个源端/目标端的场景(比如仅修改了Oracle源端的代码,需要执行所有Oracle作为源的迁移测试),可以结合Cucumber的标签功能实现:
- 给每个测试组合或者Scenario打上对应标签,例如
@Oracle、@Db2、@Oracle_to_Db2 - 新增全局Before Hook,测试执行前读取配置的数据库集合,如果当前Scenario的标签没有匹配到配置中的数据库,直接调用测试框架的跳过方法终止当前场景执行即可,不需要改动现有业务测试逻辑
内容的提问来源于stack exchange,提问作者Sunny Patel
相关产品推荐
相关产品推荐

