12

소프트웨어가 점점 더 많이 사용됨에 따라 단위 테스트 (병렬 동작이 아니라 핵심 동작)와 함께 유형의 핵심 동작 테스트를 어떻게 처리합니까?단위 테스트 동시 소프트웨어 - 당신은 무엇을합니까?

좋은 옛날에, 당신은 그것을 불렀다. 당신은 그것을 불렀다. 그리고 당신은 그것이 무엇을 반환했는지 및/또는 그것이 무엇을 호출했는지를 점검했다.

요즘에는 메서드를 호출하고 실제 작업이 다음 사용 가능한 스레드에서 실행되도록 예약됩니다. 당신은 그것이 실제로 시작되어 다른 것들을 호출 할 때를 알지 못합니다 - 그리고 무엇보다, 다른 것들도 동시적일 수 있습니다.

어떻게 처리합니까? 동시 스케줄러를 추상화/삽입합니까 (예 : 작업 병렬 라이브러리를 추상화하고 단위 테스트에서 가짜/모의를 제공합니까)?

어떤 리소스가 도움이 되었습니까?


내가 유형의 정상적인 동작을 테스트 강조하기 위해 질문을 편집 한

편집 (멀티 코어를 활용하는 데 사용되는 병렬 어떤 메커니즘을 무시하고, 예를 들면 TPL)를


답변

3

경쟁 조건 및 교착 상태에 대한 단위 테스트 필드는 상대적으로 새롭고 좋은 도구가 없습니다.

은 일찍 알파/베타 단계에서 모두이 같은 도구를 알고 :

또 다른 옵션은 "스트레스 테스트"원인이 시도하고 작성하는 것입니다 교착 상태/경쟁 조건이 표면화되고 다중 인스턴스/스레드가 만들어지고 나란히 실행됩니다. 이 승인의 단점은 테스트가 실패하면 재현하기가 매우 어렵다는 것입니다. 무슨 일이 일어 났는지 이해할 수 있도록 테스트 코드와 프로덕션 코드 모두에서 로그를 사용하는 것이 좋습니다.

+0

링크 +1에 감사드립니다. - 나는이 질문을 읽는 모든 사람들에게 도움이 될 것이라고 확신합니다. 나는 실제 문제보다는 형식의 정상적인 동작에 대해 더 많이 물어 보려고했기 때문에 제 질문을 편집했습니다. –

0

유닛 테스트는 동시성/비동기 동작을 테스트해서는 안됩니다. 거기에 mock을 사용하고 mock이 예상 입력을 수신하는지 확인해야합니다.

통합 테스트의 경우 백그라운드 작업을 명시 적으로 호출 한 다음 그 후에 기대치를 확인하십시오.

오이 그것은 다음과 같습니다

When I press "Register" 
And the email sending script is run 
Then I should have an email 
+0

좋은 점 - 필자는 필자의 질문에 필자가 핵심 동작을 테스트하고 병렬 동작을 테스트하지 않았 음을 분명히 알았다. 나는 그 질문을 편집했다. –

1

내가 유용한 발견했습니다하는 기술은 인텔 패러렐 인스펙터와 같은 경쟁 조건을 감지하는 도구 내에서 테스트를 실행하는 것입니다. 테스트는 타이밍에 대한 의존성을 검사해야하기 때문에 정상보다 훨씬 느리게 실행되지만, 한 번의 실행으로 수백만 번의 반복 실행이 필요한 버그를 찾을 수 있습니다.

멀티 코어를 통한 미세 병렬 처리를 위해 기존 시스템을 변환 할 때 매우 유용하다는 것을 알았습니다.

5

면책 조항 : 저는 Corensic, 시애틀의 소규모 창업을 위해 일합니다.코드에서 동시성 오류를 감지하도록 설계된 Jinx라는 도구가 있습니다. 우리가 베타에있는 동안 지금은 무료이지만, 당신은 그것을 체크 아웃하고 싶을지도 모른다. (http://www.corensic.com/)

요약하면 Jinx는 활성화 될 때 프로세서와 운영 체제 사이에 들어가는 매우 얇은 하이퍼 바이저입니다. Jinx는 지능적으로 실행 조각을 취하고 다양한 스레드 타이밍의 시뮬레이션을 실행하여 버그를 찾습니다. 버그가 발생하는 특정 스레드 타이밍을 발견하면 시스템에서 해당 타이밍을 "현실"로 만듭니다 (예 : Visual Studio를 사용하는 경우 디버거가 그 시점에서 중단됩니다). 그런 다음 버그가 발생한 코드의 영역을 지적합니다. Jinx에는 오 탐지가 없습니다. 버그를 발견하면 확실히 버그입니다.

Jinx는 Linux 및 Windows에서 기본 코드와 관리 코드로 작동합니다. 그것은 언어 및 응용 프로그램 플랫폼에 무관심하며 모든 기존 도구로 작업 할 수 있습니다.

체크 아웃 한 경우 작동 여부에 대한 의견을 보내주십시오. 우리는 몇 가지 큰 오픈 소스 프로젝트에서 Jinx를 실행 해 왔으며 Jinx가 코드를 테스트하는 것보다 50-100 배 빠른 버그를 발견했습니다.

+0

이것은 정말 흥미로운 것 같습니다. 병행 성 문제는 찾기 위해 수일 또는 수주, 심지어 수개월이 걸릴 수 있으며 분석적으로이를 감지하는 메커니즘이 매우 유용 할 수 있습니다. – Cobusve

0

TPL에 별도의 단위 테스트가있을 경우이를 확인하지 않아도됩니다.

각 모듈에 대해 두 가지 테스트를 작성했다고 가정합니다.
일부 환경 변수 또는 #define을 사용하여 기능적 정확성을 위해 모듈을 테스트 할 수 있도록 TPL을 사용하는 단일 스레드 단위 테스트.
2) 스레드 배포 모드에서 모듈을 실행하는 스트레스 테스트. 이 테스트는 동시성 문제를 찾으려고 시도하며 많은 무작위 데이터를 사용해야합니다.

두 번째 테스트는 종종 많은 모듈을 포함하므로 더 많은 통합/시스템 테스트가 필요합니다.

4

Growing Object Oriented Software by Freeman and Pryce 사본을 가져 오는 것이 좋습니다. 마지막 두 장은이 특정 주제에 대해 매우 계몽적이고 다루기 쉽습니다. 또한 토론 표기법을 고정하는 데 도움이되는 몇 가지 용어를 소개합니다.

요약하면 .... 핵심 아이디어는 의 기능과 동시/동시 측면을 분할하는 것입니다..

  • 우선 시운전 정상 개체와 같은 단일 스레드 동기 기능 부한다.
  • 일단 기능 부품을 고정하십시오. 동시 측면으로 이동할 수 있습니다. 그렇게하기 위해서는 객체에 대해 "관찰 가능한 불변 변수 w.r.t. 동시성"을 생각해 내야합니다. 카운트는 메소드가 호출 된 시간과 같아야합니다. 일단 불변량을 확인하면 불변량을 시도하고 깨뜨리기 위해 여러 개의 스레드를 실행하는 스트레스 테스트를 작성할 수 있습니다. 스트레스 테스트는 불변성을 주장합니다.
  • 마지막으로 추가 방어 수단으로 도구 또는 정적 분석을 실행하여 버그를 찾습니다.

다른 객체의 클라이언트에서 호출되는 수동 객체의 경우 : 테스트가 자체 스레드를 시작하여 클라이언트를 모방해야합니다. 그런 다음 테스트를 SUT와 동기화하기 위해 알림 수신 또는 샘플링/폴링 방식 중 하나를 선택해야합니다.

  • 당신은 수 중 블록이 예상 통지
  • 설문 조사를 합리적인 제한 시간에 특정 관찰 부작용을받을 때까지.