Coyote
土狼是一个跨平台库,也是用于测试并发C#代码和确定性再现错误的工具。
使用Coyote,您可以通过编写我们称为并发单元测试的内容来轻松地测试C#代码中的并发和其他非确定性。这些看起来像您的常规单元测试,但可以可靠地测试并发工作负载(例如,对ASP.NET控制器的参与者,任务或并发请求)。在常规的单元测试中,您通常会由于片状而避免并发,但是借助土狼,您被鼓励在测试中接受并发以查找错误。
Azure中的许多团队都使用土狼测试其分布式系统和服务,并在将代码部署在生产中并影响用户之前发现了数百个与并发相关的错误。用Azure服务架构师的话说:
土狼在开发过程的早期发现了几个问题,这种问题通常会流血到生产中,以后变得非常昂贵。
土狼是由Microsoft Research由❤️制造的。
考虑以下简单测试:
[ Fact ]
public async Task TestTask ( )
{
int value = 0 ;
Task task = Task . Run ( ( ) =>
{
value = 1 ;
} ) ;
Assert . Equal ( 0 , value ) ;
await task ;
}
该测试将大部分时间通过,因为断言通常会在任务启动之前执行,但是在一个时间表中,任务启动足够快以将value
设置为1
从而导致断言失败。当然,这是一个非常幼稚的例子,这个错误很明显,但是您可以想象更复杂的种族条件隐藏在复杂的执行路径中。
土狼的工作方式是,您首先使用Coyote TestingEngine
API将上述测试转换为并发单元测试:
using Microsoft . Coyote . SystematicTesting ;
[ Fact ]
public async Task CoyoteTestTask ( )
{
var configuration = Configuration . Create ( ) . WithTestingIterations ( 10 ) ;
var engine = TestingEngine . Create ( configuration , TestTask ) ;
engine . Run ( ) ;
}
接下来,您从CLI(通常是后构建任务)运行coyote rewrite
命令,以自动重写测试和生产二进制文件的IL。这使土狼可以注入控制测试过程中并发执行的钩子。
然后,您可以从您喜欢的单元测试框架(例如Xunit)中运行并发单元测试。 Coyote将接管并反复执行N迭代的测试(在上面的示例中,n配置为10
)。在引擎盖下,土狼使用智能搜索策略来探索可能隐藏每次迭代中错误的各种执行路径。
令人敬畏的是,一旦找到错误,土狼就可以通过engine.TestReport
为您提供跟踪。TestReportAPI,您可以根据需要可靠地可靠地重现错误,从而使调试和解决问题更加容易。
与土狼入门很容易!首先,遵循本指南,从Nuget安装coyote
命令行工具。现在,您准备访问Coyote网站以获取有关该项目的教程,文档,操作方法,样本以及更多信息。享受!
升级您的coyote
依赖性?在此处检查Changelog。
请注意,土狼是一个提供“原样”的开源项目。我们无法提供任何正式的支持。对于Microsoft员工,我们有Coyote Teams频道的朋友,这是一个内部社区,可以帮助回答问题并相互学习。
该项目欢迎贡献和建议。大多数捐款要求您同意撰写贡献者许可协议(CLA),宣布您有权并实际上授予我们使用您的贡献的权利。有关详细信息,请访问https://cla.opensource.microsoft.com。
当您提交拉动请求时,CLA机器人将自动确定您是否需要提供CLA并适当装饰PR(例如状态检查,评论)。只需按照机器人提供的说明即可。您只需要使用我们的CLA在所有存储库中执行一次。
该项目采用了Microsoft开源的行为代码。有关更多信息,请参见《行为守则常见问题守则》或与其他问题或评论联系[email protected]。