확률 론적 행동으로 프로그램을 테스트하기위한 모범 사례는 무엇입니까? 버그가 간헐적으로 발생하고

R & D 작업을 할 때, 나는 종종 자신의 행동에 어느 정도의 무작위성을 가진 프로그램을 작성하는 것을 발견합니다. 예를 들어, 유전자 프로그래밍에서 작업 할 때 임의의 임의 소스 코드를 생성하고 실행하는 프로그램을 작성하는 경우가 많습니다.

이러한 코드를 테스트 할 때 발생하는 문제는 버그가 간헐적으로 발생하고 재현하기가 매우 어렵다는 것입니다. 이것은 임의의 시드를 동일한 값으로 설정하고 실행을 시작하는 것 이상입니다.

예를 들어, 코드는 커널 링 버퍼에서 메시지를 읽은 다음 메시지 내용을 조건부로 점프 할 수 있습니다. 당연히 링 버퍼의 상태는 나중에 문제를 재현하려고 할 때 변경 될 것입니다.

이 동작은 기능 이지만 예기치 않은 방식으로 다른 코드를 트리거 할 수 있으므로 단위 테스트 (또는 사람 테스터)가 찾지 못하는 버그가 종종 드러납니다.

이런 종류의 테스트 시스템에 대한 모범 사례가 있습니까? 그렇다면 일부 참고 문헌이 매우 도움이 될 것입니다. 그렇지 않은 경우 다른 제안을 환영합니다!



답변

제안 된대로 정확한 상태를 재현하기 위해 후크를 추가하는 것이 유용합니다. 또한 “시드”를 덤프 할 수 있도록 시스템을 계측하십시오 (귀하의 경우 PRNG 시드, 커널 링 버퍼 및 기타 비 결정적 입력 소스 포함).

그런 다음 실제 무작위 입력과 이전에 발견 된 흥미로운 사례로 회귀 스타일로 테스트를 실행하십시오.

커널에 액세스하는 특별한 경우에는 어떤 경우에도 모의를 만드는 것이 좋습니다. 실습을 사용하여 컨테이너에 대해 “빈”및 “전체”또는 “0, 1, 2 ^ n, 2 ^ n + 1, many”라는 개념으로 실제로 표시되지 않는 동등성 클래스를 강제 실행하십시오. 셀 수있는 것들. 그런 다음 지금까지 생각했던 사례를 처리하고 테스트했다는 사실을 알고 모의와 실제 테스트를 수행 할 수 있습니다.

기본적으로, 내가 제안하는 것은 결정 론적 입력과 비결정론 적 입력의 혼합에 해당합니다. 결정 론적 입력은 당신이 생각할 수있는 것과 당신이 놀란 것을 혼합 한 것입니다.


답변

합리적인 한 가지 방법은 테스트에 일정한 값으로 난수 생성기를 시드하여 결정적인 동작을 얻는 것입니다.


답변

통계 테스트가 유일한 방법이라고 생각합니다. 통계 테스트에 의해 임의의 숫자가 임의성에 대해 “테스트”되는 것처럼 임의의 동작을 사용하는 알고리즘이어야합니다.

동일하거나 다른 입력으로 알고리즘을 여러 번 실행하고 서로 비교하십시오. 이 방법의 문제점은 테스트를 마치는 데 필요한 계산 시간이 크게 증가한다는 것입니다.


답변

저는이 분야의 전문가는 아니지만 확률 적 프로그램 테스트와 관련하여 과학적인 자료가 있습니다.

테스트 클래스를 쉽게 만들 수 없다면 #Euphoric이 말한 것처럼 통계 테스트를 사용할 수 있습니다. Borning et al. 전통적인 접근법과 통계적인 접근법을 비교합니다. @Euphoric이 제안한 통계 테스트의 일반화는 Whittaker가 논의한 것일 수 있습니다. 그는 원하는 (토큰의 경우 확률 론적) 행동의 확률 론적 모델을 만든 다음이 모델에서 특정 테스트 사례를 생성 할 것을 제안했습니다 ( 자신의 전용 논문 참조 ).