如何解决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测试运行器
解决方法
昨天和今天,我花了很多时间来研究这个问题,今天在我的DAL中添加了登录信息,以弄清楚在数据库中创建和删除对象的过程,并最终在我使用的辅助库中发现了一个非常偷偷摸摸的错误与Dapper;它选择了一个名称以GUID结尾的字段,并在自动构建的删除查询中使用它,而不是使用实际的ID字段。由于我用于数据库的对象库是与产品团队共享的,因此我无法使用自己的属性来修饰它,因此对此问题感到愚蠢。谢谢@GregBurghardt的帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。