문제

교착 상태와 레이스 조건에 취약 할 수있는 코드에 대한 반복 가능한 단위 테스트를 작성하는 방법에 대한 제안이 있습니까?

지금은 단위 테스트를 건너 뛰고 스트레스 테스트에 중점을두고 있습니다. 그 문제는 스트레스 테스트를 5 번 실행하고 5 가지 결과를 볼 수 있다는 것입니다.

편집 : 나는 그것이 단지 꿈 일 것임을 알고 있지만, 개별 스레드를 제어하고 한 번에 하나의 명령을 실행할 수있는 방법이 있다면 어딘가에 도착할 수 있습니다.

도움이 되었습니까?

해결책

보세요 타입 콕 레이서 (베타에 있습니다)

편집 : 실제로 알파

http://www.typemock.com/typemock_software_development_tools.html

다른 팁

일반적으로 강요 할 수 있습니다 예측 Race -Conditions 및 Deadlocks는 ManualResetevent와 같은 것을 사용하여 각 스레드를 공개하기 전에 각 스레드를 예상 상태로 가져 오기 위해 - 즉, 스레드 A를 얻을 수 있도록 스레드 A를 얻고 신호를 기다리십시오.

그러나 - 일반적으로 버그가 의심되는 버그를 조사하기 위해 이러한 테스트를 작성하여 고정되었을 때를 입증하고 다시 표면이 되돌아 가지 않을 수 있습니다. 일반적으로 인종 조건을 중심으로 설계 할 것입니다 (그러나 실용적으로 최선을 다하십시오).

나는 인종 조건을 찾는 것이 실제로 단위 테스트 영역에 속한다고 생각하지 않습니다. 정의에 따라 더 많은 인종 조건을 테스트하는 유일한 방법은 의사 무작위입니다. 잠금 전략의 정확성을 공식적으로 증명하려는 노력에 기꺼이 가지 않으면 스트레스 테스트를 수행해야합니다.

잠금 전략이 아닌 알고리즘의 정확성을 확인하려면 여전히 단위 테스트를 작성해야합니다.

스트레스 테스트 다중 스레드 코드를 사용하면 스레드 당 하나의 CPU가있는 조건에서 CPU를 공유하는 여러 스레드가있는 조건에서 테스트하고 스레드보다 CPU가 더 많습니다 (가능하면).

잠금 작업의 순서를 살펴보면 잠재적 교착 상태를 감지하는 잠금 클래스를 작성할 수 있습니다. 우리는 모든 잠금이 획득 할 때 등록하는 스레드 컨텍스트를 통해이를 수행합니다 (디버그 전용 옵션으로 만들 수 있음).

아이디어는 노드가 잠금을 나타내는 그래프를 만들고 A와 B 사이의 지시 된 가장자리는 '잠금 B가 획득 될 때 잠금 A가 유지되었다고 의미합니다'를 의미합니다. 정상 하중을 사용하여 프로그램을 실행 한 다음 그래프에서 사이클을 확인하십시오. 주기는 코드가 발생하지 않더라도 교착 상태가있을 가능성이 있음을 의미합니다.

좋은 자동화 된 방법을 생각할 수는 없지만, 가장 가까운 것은 교착 상태를 '노출'하는 단위 테스트를 작성하는 것이 단위 테스트 외에 중단 점을 사용하는 것입니다. 중단 점을 추가 할 위치에 대한 몇 가지 지침을 추가했습니다. 수동 노력이 필요하지만, 그들과 함께 항상 더 나쁜 케이스 스레드 일정을 노출시킬 수 있습니다.

아마도 누군가가 이러한 유형의 기능을 자동화하는 좋은 방법을 생각했을까요? 디버거를 자동으로 실행하고 특정 라인에서 하나의 스레드를 깨고 특정 조건까지 다른 하나를 실행 한 다음 장치 테스트를 주장 할 수 있습니다.

이전에 요청의 일부 매개 변수에 의해 트리거 된 코드에서 인공 지연을 사용했습니다. 예를 들어, 한 요청은 서버에게 두 개의 쓰기 사이에 쓰기를 지연 시키라고 지시합니다.

Mark Bessey는 다음과 같이 썼습니다. 이것은 문제를 발견하는 것이 아니라 재현을 만드는 데 유용합니다.

당신은 시도 했습니까? Corensic Jinx?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top