如何高效复用Specflow场景大纲及步骤,无需重复编写整套测试场景
解决方案
方案1:场景层复用,无需复制场景大纲
直接把作用域类型作为参数放到场景大纲的占位符中,调整步骤的占位符后在Examples表新增对应列即可,一套场景可以覆盖所有作用域类型的测试:
Scenario Outline: Member is assigned to dynamic scope Given a dynamic <scope type> scope with "<id>", "<name>", "<description>" and "<filter>" exist When I post new member assign request with "<member id>", "<first name>", "<last name>" and "<email>" Then the response is "<status code>" And a member with "<member id>", "<first name>", "<last name>" and "<email>" is added to the dynamic <scope type> scope Examples: | no | scope type | id | name | desc | filter | member id | first name | last name | email | status code | | 1 | device | 01 | name | desc | filter | ee749612 | first | last | t1@mail.com| Created | | 2 | people | 02 | name | desc | filter | ee749613 | first2 | last2 | t2@mail.com| Created |
方案2:调整步骤绑定代码,兼容多类型作用域
修改原来的Given步骤正则,把作用域类型作为参数捕获,通过分支逻辑调用不同的构造方法即可,不需要写两个独立的Given步骤:
[Given(@"a dynamic (device|people) scope with ""(.*)"", ""(.*)"", ""(.*)"" and ""(.*)"" exist")] public void GivenADynamicScopeWithAndExist(string scopeType, Guid id, string name, string description, string filter) { if (scopeType == "device") { _scopeId = _scenarioSettings.ScopesStorage.BuildTestDynamicDeviceScope(id, name, description, filter); } else if (scopeType == "people") { // 调用dynamic people scope对应的构造方法 _scopeId = _scenarioSettings.ScopesStorage.BuildTestDynamicPeopleScope(id, name, description, filter); } }
如果后续作用域类型会持续增加,可以用字典映射简化逻辑,避免堆叠if-else:
// 类内初始化映射字典 private readonly Dictionary<string, Func<Guid, string, string, string, Guid>> _scopeBuilderMap = new Dictionary<string, Func<Guid, string, string, string, Guid>> { ["device"] = (id, name, desc, filter) => _scenarioSettings.ScopesStorage.BuildTestDynamicDeviceScope(id, name, desc, filter), ["people"] = (id, name, desc, filter) => _scenarioSettings.ScopesStorage.BuildTestDynamicPeopleScope(id, name, desc, filter) }; // 步骤方法简化为 [Given(@"a dynamic (device|people) scope with ""(.*)"", ""(.*)"", ""(.*)"" and ""(.*)"" exist")] public void GivenADynamicScopeWithAndExist(string scopeType, Guid id, string name, string description, string filter) { _scopeId = _scopeBuilderMap[scopeType](id, name, description, filter); }
对应的Then步骤中涉及作用域类型的绑定代码,也可以按照相同的正则改造逻辑复用,不需要重复写步骤实现。
内容的提问来源于stack exchange,提问作者Mihai Usurelu
相关产品推荐
相关产品推荐

