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


14

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

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

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

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

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


5
커널 링 버퍼도 조롱 할 수 없습니까? 그리고 코드의 다른 임의의 측면은 무엇입니까?
Jonathan Merlet

1
@JonathanMerlet 잠재적으로 문제는 배포시 코드가 실제 링 버퍼 (실제로 실제 OS)에 액세스 할 수 있다는 것 입니다. 따라서 내가 조롱 한 버전에서만 테스트하면 나중에이 버그의 발견을 연기합니다.
John Doucette

문제는 프로그램의 무작위 동작 과 관련이 없으며 (임의의 시드로 제어 할 수 있기 때문에)이 '커널 링 버퍼'의 특정 상태와 관련이 있습니다. 따라서 귀하의 질문은 실제로 '외부 상태에 의존하는 프로그램을 어떻게 테스트합니까?'입니다.
AakashM

@AakashM, 그래, 그것은 그것을 표현하는 더 좋은 방법입니다. 보다 구체적으로 말하면, 외부 상태를 가진 프로그램은 외부 상태를 확률 적으로 액세스하거나 변경합니다.
John Doucette

답변:


7

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

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

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

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


6

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


1
이; 또는 prng을 완전히 조롱하십시오
jk.

1
제안 해 주셔서 감사합니다! 단위 테스트를 위해 이미이 작업을 수행하지만 가능한 모든 프로그램을 직접 테스트 할 수는 없습니다.
John Doucette

2
그러나 이것은 무작위성이 제대로 작동하는지 테스트 할 수 없음을 의미합니다.
Louis Rhys

2

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

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


반드시 필요한 것은 아니지만 작은 "스패닝"입력 세트를 선택하고 여러 번 실행할 수 있기 때문에 신뢰성을 확인하는 데 필요한 입력 수가 더 적을 수 있습니다. 이 "에 걸쳐"세트는 코드의 모든 분기를 입력 한 모든 오브젝트 등을 초기화한다
다니엘 Moskovich을

2

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

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


감사! 매우 도움이됩니다. 교육 기관 외부의 사람들을 위해 저자의 Google 코드 저장소 에서이
John Doucette
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.