[unit-testing] 단위 테스트의 무작위 데이터?



Answers

이런 종류의 테스트를 원숭이 테스트 라고합니다. 바로 끝나면 정말 어두운 구석에서 벌레를 내뿜을 수 있습니다.

재현 가능성에 대한 귀하의 우려를 해소하기 위해 : 이것에 접근하는 올바른 방법은 실패한 테스트 항목을 기록하고, 특정 버그의 전체 패밀리 를 조사하는 단위 테스트를 생성하며, 단위 테스트에서 초기 실패를 유발 한 하나의 특정 입력 (임의 데이터로부터)을 포함합니다.

Question

필드에 임의의 데이터를 채우는 개체에 대한 단위 테스트를 작성하는 동료가 있습니다. 그의 이유는 다양한 값을 테스트 할 것이기 때문에 더 넓은 테스트 범위를 제공하는 반면 일반 테스트는 하나의 정적 값만을 사용하기 때문입니다.

나는 이것에 대해 여러 가지 다른 이유를 주었다.

  • 무작위 값은 테스트가 실제로 반복 가능하지 않다는 것을 의미합니다 (이는 테스트가 임의로 실패 할 수있는 경우 빌드 서버에서 수행하여 빌드를 중단 할 수도 있음을 의미합니다)
  • 임의의 값이고 테스트가 실패하면 a) 객체를 수정하고 b) 매번 그 값을 테스트하도록 강요해야합니다. 따라서 작동한다는 것을 알기 때문에 무작위 적이므로 값이 무엇인지 알지 못합니다.

또 다른 동료가 추가됨 :

  • 예외를 테스트하는 경우 임의의 값으로 테스트가 예상 된 상태로 끝나지 않습니다.
  • 단위 테스트가 아닌 시스템 및로드 테스트를 플러시하는 데 무작위 데이터가 사용됩니다.

다른 사람이 내가이 일을 그만 둘 수있는 이유를 추가 할 수 있습니까?

(또는 교대로 이것은 단위 테스트를 작성하는 데 사용할 수있는 방법이며, 나와 다른 동료가 잘못 되었습니까?)




그가 그것을 고쳤는지 보지 못했을 때 어떻게 당신의 녀석은 시험을 다시 실행할 수 있습니까? 즉 그는 반복적 인 테스트를 잃어 버린다.

다른 응답에서 언급했듯이 테스트에서 무작위 데이터의로드에 약간의 가치가있을 것이라고 생각하지만로드 테스트의 제목 아래에는 다른 것보다 더 많이 포함됩니다. 그것은 "시험에 의한 희망"에 관한 것입니다. 제 생각에, 당신의 녀석은 자신이 테스트하려고하는 것에 대해 생각하지 않고, 무작위성을 기대함으로써 그 생각을 보충하는 것은 마침내 어떤 신비한 오류를 잡을 것이라고 생각합니다.

그래서 내가 그와 함께 사용할 논쟁은 그가 게으르다는 것입니다. 또는 다른 방법으로 말하자면, 그가 테스트하려고하는 것을 이해할 시간을 가지지 않는다면 아마도 그가 작성한 코드를 실제로 이해하지 못한다는 것을 알 수 있습니다.




당신의 동료는 그것에 대해 알지 못하더라도 fuzz-testing 를하고 있습니다. 이들은 서버 시스템에서 특히 유용합니다.




당신은 자신의 시험 목표가 무엇인지 스스로 물어야합니다.
단위 테스트 는 논리, 코드 흐름 및 객체 상호 작용 확인에 관한 것입니다. 임의의 값을 사용하면 다른 목표를 달성하려고하므로 테스트 포커스와 단순성이 줄어 듭니다. 가독성을 이유로 (UUID, ID, 키 등 생성) 허용됩니다.
특히 단위 테스트의 경우이 방법이 문제를 성공적으로 찾았더라도 기억할 수 없습니다. 그러나 나는 많은 결정 론적 문제 (테스트에서)가 무작위 값으로 영리하고 무작위로 주로 시도하는 것을 보았습니다.
Fuzz testing은 통합 테스트end-to-end 테스트를 위한 유효한 접근 방식입니다.




테스트를 보는 누군가를위한 한 가지 이점은 임의의 데이터가 분명히 중요하지 않다는 것입니다. 수십 개의 데이터가 포함 된 테스트가 너무 많아서 그런 식으로 무엇이 필요하며 그저 그런 식으로해야 하는지를 말하기가 어려울 수 있습니다. 예를 들어 주소 확인 방법이 특정 우편 번호로 테스트되고 다른 모든 데이터가 무작위이면 우편 번호가 유일한 중요한 부분 일 수 있습니다.




Beautiful Code 의 책에는 "Beautiful Tests"라는 장이 있는데이 곳에서 이진 검색 알고리즘에 대한 테스트 전략을 거칩니다. 한 단락은 알고리즘의 철저한 테스트를 위해 무작위 배열을 만드는 "Random Acts of Testing"이라고 불립니다. 온라인 도서 중 일부는 95 페이지의 Google 도서에서 읽을 수 있지만 가치가있는 훌륭한 책입니다.

그래서 기본적으로 이것은 테스트를위한 임의의 데이터 생성이 실행 가능한 옵션임을 보여줍니다.




테스트에 무작위 입력을 사용하는 경우 값을 볼 수 있도록 입력을 로그해야합니다. 이런 식으로 어떤 우연한 경우가 생기면 테스트를 작성하여 재현 할 수 있습니다. 사람들이 무작위 입력을 사용하지 않은 것과 같은 이유를 들었지만 특정 테스트 실행에 사용 된 실제 값에 대한 통찰력을 얻은 후에는 그다지 문제가되지 않습니다.

"임의"데이터의 개념은 중요 하지 않은 것을 나타내는 방법으로도 매우 유용합니다. 현재 테스트와 관련이없는 많은 노이즈 데이터가있는 곳을 생각해 볼 수있는 몇 가지 수용 테스트가 있습니다.




우린 방금 이걸 만났어. 나는 pseudo-random을 원했다 (크기면에서 압축 된 오디오 데이터처럼 보일 것이다). 나는 또한 결정 론적 이기를 원했다. rand ()는 OSX에서 리눅스와 다릅니다. 다시 시드하지 않으면 언제든지 바뀔 수 있습니다. 그래서 우리는 그것을 결정 론적이면서도 가짜 무작위로 변경했습니다. 테스트는 통조림 데이터를 사용하는 것만큼이나 반복적입니다 (그러나보다 편리하게 작성되었습니다).

이것은 코드 경로를 통해 임의의 무차별 대항력에 의한 테스트가 아니 었습니다. 여전히 결정론적이고 반복 가능하며 복잡한 로직의 엣지 경우에 대해 흥미로운 검사를 실행하기 위해 실제 입력과 같이 보이는 데이터를 사용합니다. 아직도 단위 테스트.

자격이 여전히 무작위입니까? 맥주 얘기합시다. :-)




Links