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


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.