Coyote
Coyote는 동시 C# 코드를 테스트하고 버그를 결정하기위한 크로스 플랫폼 라이브러리 및 도구입니다.
Coyote를 사용하면 동시성 단위 테스트 라고 부르는 것을 작성하여 C# 코드에서 동시성 및 기타 비 투구를 쉽게 테스트 할 수 있습니다. 이는 정기적 인 단위 테스트처럼 보이지만 동시 워크로드 (예 : ASP.NET 컨트롤러에 대한 동시 요청과 같은 동시 워크로드를 안정적으로 테스트 할 수 있습니다. 정기적 인 단위 테스트에서는 일반적으로 Flakiness로 인한 동시성을 피할 수 있지만 Coyote의 경우 버그를 찾기 위해 테스트에서 동시성을 수용하는 것이 좋습니다.
Coyote는 Azure의 많은 팀에서 분산 시스템 및 서비스를 테스트하는 데 사용되며 프로덕션에 코드를 배포하고 사용자에게 영향을 미치기 전에 수백 개의 동시성 관련 버그를 발견했습니다. Azure Service Architect의 말로 :
Coyote는 DEV 프로세스 초기에 몇 가지 문제를 발견했습니다. 이러한 종류의 문제는 일반적으로 생산으로 출혈되어 나중에 수정하기가 매우 비싸게됩니다.
Coyote는 Microsoft Research에서 is️으로 만들어졌습니다.
다음 간단한 테스트를 고려하십시오.
[ Fact ]
public async Task TestTask ( )
{
int value = 0 ;
Task task = Task . Run ( ( ) =>
{
value = 1 ;
} ) ;
Assert . Equal ( 0 , value ) ;
await task ;
}
이 테스트는 대부분 작업이 시작되기 전에 어설 션이 실행되기 때문에 대부분의 시간을 통과하지만, 작업이 value
1
으로 설정할 수있을 정도로 빠르게 시작하여 어설 션이 실패하게됩니다. 물론 이것은 매우 순진한 예이며 버그는 분명하지만 복잡한 실행 경로에 숨겨져있는 훨씬 더 복잡한 인종 조건을 상상할 수 있습니다.
코요테가 작동하는 방식은 코요테 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)에서 동시 장치 테스트를 실행할 수 있습니다. 코요테는 N 반복에 대한 시작부터 끝까지 테스트를 인계하고 반복적으로 실행합니다 (위의 예에서 N은 10
으로 구성되었습니다). 후드에서 코요테는 지능형 검색 전략을 사용하여 각 반복에서 버그를 숨길 수있는 모든 종류의 실행 경로를 탐색합니다.
멋진 점은 버그가 발견되면 Coyote는 engine.TestReport
통해 추적을 제공한다는 것입니다. 테스트 레포트 API는 원하는만큼 버그를 안정적으로 재현하여 디버깅 및 문제를 훨씬 쉽게 수정하는 데 사용할 수 있습니다.
코요테를 시작하는 것은 쉽습니다! 먼저이 안내서를 따라 Nuget에서 coyote
명령 줄 도구를 설치하십시오. 이제 튜토리얼, 문서, 방법, 샘플 및 프로젝트에 대한 자세한 정보는 코요테 웹 사이트를 확인할 준비가되었습니다. 즐기다!
coyote
의존성 업그레이드? ChangeLog를 여기에서 확인하십시오.
코요테는 "AS-IS"가 제공되는 오픈 소스 프로젝트입니다. 우리는 공식적인 지원을 제공 할 수 없습니다. Microsoft 직원의 경우 Coyote Teams Channel의 친구가 있습니다.이 커뮤니티는 질문에 대답하고 서로를 배울 수있는 내부 커뮤니티입니다.
이 프로젝트는 기여와 제안을 환영합니다. 대부분의 기부금은 귀하가 귀하가 귀하의 기부금을 사용할 권리를 부여 할 권리가 있다고 선언하는 기고자 라이센스 계약 (CLA)에 동의해야합니다. 자세한 내용은 https://cla.opensource.microsoft.com을 방문하십시오.
풀 요청을 제출할 때 CLA 봇은 CLA를 제공하고 PR을 적절하게 장식 해야하는지 자동으로 결정합니다 (예 : 상태 점검, 댓글). 봇이 제공 한 지침을 따르십시오. CLA를 사용하여 모든 저장소에서 한 번만이 작업을 수행하면됩니다.
이 프로젝트는 Microsoft 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 추가 질문이나 의견이 있으면 행동 강령 FAQ 또는 [email protected]에 문의하십시오.