SpecFlow上下文注入线程安全吗?

问题描述

我正在使用SpecFlow来驱动API集成测试工具,该工具将提供有关新UI API的实时文档和测试范围。我写了一些功能文件,最后我试图并行运行约60个测试。但是,尽管我可以单独运行这些功能没有问题,但是在尝试使用Visual Studio 2019测试运行程序和XUnit运行程序插件并行运行它们时,却遇到了间歇性故障。

任何给定的SpecFlow场景都将利用来自两个不同的步骤绑定类的步骤,并且这些步骤绑定类中的每一个都可能需要注入最多三个上下文对象,以便在场景中捕获状态并在场景后清理环境完成。例如,某个功能可能看起来像这样:

Scenario: Retrieving Message records returns data
Given I have created the following ClientAccounts:
    | Index | SiteID | IsActive |
    | 1     | 1      | 1        |
And I have created the following Logins:
    | Index | IsActive |
    | 1     | 1        |
And I have created the following Messages:
    | MessageID | MessageText |
    | 1         | Asdfasdf    |
When I send an authentication request using the first Login and the IP Address 127.0.0.1
And I send a read request to the v1 Message endpoint for the first Message record created:
Then the first Message response should be equivalent to the following data for the first Message record created:
    | MessageTest |
    | Asdfasdf    |

前三个步骤属于一个名为DatabaseSteps的类,该类的构造函数接受DataUtility类的实例,该实例有助于对数据库的CRUD操作/从数据库进行CRUD操作并跟踪在测试执行过程中创建了哪些记录。还有一些[StepArgumentTransformation]绑定将这些表转换为可以插入数据库的数据库对象。

第四,第五和第六步属于其他步骤类,这些类的构造函数将用于数据库访问的DataUtility和用于存储会话信息以及先前已保存的API响应信息的ApiClientContext作为依存关系。断言在“然后”阶段获得的实际响应。 DataUtility类实现IDisposable,以简化测试后清理。

基于documentation,我希望通过内置DI容器注入的上下文类将是线程安全的。但是,我发现无论是使用DataUtility实现IDisposable还是通过不声明接口而直接从[AfterScenario]钩子直接调用Dispose(),与预期返回的数据有关的测试在大多数测试运行期间均会失败。很难确定地说是因为对并发问题进行故障排除,但是好像DataUtility实例正在场景之间共享,并且当任何给定的场景在数据实用程序上调用Dispose()时,我所搭建的所有测试数据都是已清除-甚至在其他不相关的情况下也是如此。当我既没有在DataUtility类上声明IDisposable时,也没有从钩子中调用Dispose()时,测试将无意外地执行。我是否需要建立一种特殊的方法来设置一个注入的上下文类,以便每个方案都具有自己的该类实例?

其他详细信息:VS2019,SpecFlow 3,XUnit测试运行器

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)