단위 테스트의 직교성 대 단위 테스트의 결정


14

비디오 게임의 스티어링 시스템에 대한 단위 테스트를 작성하고 있습니다. 시스템에는 여러 가지 동작이 있습니다 (이유 영역 A로 인해이 영역을 피하고,이 영역 B로 인해이 영역을 피하십시오. 각각이 영역의 맵에 약간의 컨텍스트를 추가 함) 별도의 함수가 맵을 구문 분석하고 원하는 이동을 생성합니다.

동작에 대한 단위 테스트 작성 방법을 결정하는 데 문제가 있습니다. TDD가 제안했듯이, 나는 행동이 원하는 움직임에 어떻게 영향을 미치는지에 관심이 있습니다. 예를 들어, 이유-이유-를 피하면 제안 된 잘못된 위치에서 멀어 지도록 이동해야합니다. 실제로 행동이 맵에 컨텍스트를 추가하는 방법과 이유는 중요하지 않으며 원하는 움직임이 위치에서 멀어 지기만합니다.

그래서 각 행동에 대한 나의 테스트는 행동을 설정하고 그것을 맵에 쓴 다음 맵 파싱 기능을 실행하여 원하는 움직임을 해결합니다. 그 움직임이 내 사양을 충족하면 행복합니다.

그러나 이제 내 테스트는 올바르게 작동하는 동작과 올바르게 작동하는 맵 구문 분석에 의존합니다. 구문 분석 기능이 실패하면 몇 가지가 아니라 수백 가지의 실패한 테스트를 받게됩니다. 많은 테스트 작성 안내서에서는 이것이 나쁜 생각이라고 제안합니다.

그러나 맵을 조롱하여 동작의 출력에 대해 직접 테스트하면 구현과 너무 밀접하게 연결되어 있습니까? 약간 다른 동작을 사용하여지도에서 동일한 원하는 움직임을 얻을 수 있다면 테스트는 여전히 통과해야합니다.

그래서 지금인지인지 불협화음에 시달리고 있습니다. 이러한 테스트를 구성하는 가장 좋은 방법은 무엇입니까?


... 마법적인 대답이 있는지 확실하지 않습니다. 기본적으로 깨질 수있는 것들을 테스트합니다. 따라서 이상적으로는 어떤 하위 수준 테스트가 이미 자체 하위 수준의 단위 테스트가 필요하지 않은 상위 ​​수준 테스트로 충분히 다루어 질지 마법으로 알 수 있습니다. 또 다른 방법은 테스트가 실패한 시점부터 개발자가 문제를 해결하는 시점까지 얼마나 많은 시간이 소요됩니까? 이 시간이 짧기를 원합니다. 단위가없고 완벽한 기능 테스트 (전체 고수준 적용 범위) 만 수행 한 경우 해당 시간이 여전히 너무 깁니다. 휴리스틱 가이드로 사용하십시오.
Calphool

답변:


10

이상적인 세계에서는 실제로 동일한 추상화 수준에서 완벽하게 직교 단위 테스트를 수행하게됩니다.

실제 환경에서는 일반적으로 다양한 수준의 앱에 대한 테스트가 있으므로 상위 수준 테스트는 전용 하위 수준 테스트에서 이미 테스트 한 기능을 사용하는 경우가 많습니다. (많은 사람들은 단위 테스트보다는 이러한 높은 수준의 테스트 하위 시스템 / 통합 테스트를 선호하지만 여전히 동일한 단위 테스트 프레임 워크에서 실행할 수 있으므로 기술적 인 관점에서 큰 차이는 없습니다.)

나는 이것이 나쁜 것이라고 생각하지 않습니다. 요점은 코드가 프로젝트와 상황에 맞는 최상의 방식으로 테스트되고 "이상적인 방식"을 따르지 않는 것입니다.


필자는 저자의 주요 요점은 이러한 높은 수준의 테스트를 위해 스텁 / 모의를 사용해야하는지 실제 구현을 사용해야하는지
SiberianGuy

2

이런 종류의 테스트는 모의가 고안된 이유입니다. 주요 아이디어 : 객체에 대한 모의 (맵, 비헤이비어, 캐릭터 등)를 작성한 다음 실제 객체 대신 해당 모의를 사용하여 테스트를 작성합니다. 사람들은 때때로 모의 스터브 (stubs)라고 부릅니다.

귀하의 경우, 행동을 테스트해야 할 때마다 맵에 대한 모의를 작성하고 맵을 테스트하고자 할 때마다 동작에 대한 다른 모의를 작성합니다. 모의는 실제 모의하는 것보다 훨씬 간단하고 테스트에 실제로 필요한 메소드 나 변수 만 통합하는 것이 이상적입니다. 각 테스트마다 다른 모의를 작성해야하거나 일부 모의를 재사용 할 수 있습니다. 어쨌든, 그들은 시험에 적합해야하며 가능한 한 실제 행동과 비슷하지 않아야합니다.

지도 나 행동의 몇 가지 예를 포함 시켰다면 누군가가 당신이 쓸 수있는 모형의 예를 제공 할 수있을 것입니다. 나는 Pong보다 더 진보 된 비디오 게임을 프로그래밍 한 적이 없으며 심지어 책을 따르고 있었지만 단위 테스트와 게임 개발에 정통한 사람 일 수도 있습니다.


0

나는 당신이 단위보다 훨씬 높은 수준의 물건을 시험하려고 생각합니다.

대부분의 행동 테스트는 올바르게 작동하는지 확인하기 위해 약간의 지능이 필요합니다. 자동화 된 테스트로는 쉽게 수행 할 수 없습니다.


이것이 제가 결정을 언급 한 이유입니다. 작은 단위 테스트를 작성하여 동작 내에서 개별 코드 행을 테스트 할 수는 있지만, 맵 파싱 함수의 출력을 읽는 데 달려 있습니다. 내 행동 테스트는 크지 않으며 각각 행동의 기능 중 하나만 테스트합니다.
tenpn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.