테스트 당 하나의 주장 만 있어야하는 경우 여러 입력을 테스트하는 방법?


15

테스트 사례를 작성하려고 시도 중이며 테스트 사례 당 어설 션 수를 제한하고 시도해야한다는 것을 읽었습니다.

그래서 제 질문은 여러 입력으로 함수를 테스트하는 가장 좋은 방법은 무엇입니까? 예를 들어, 사용자의 문자열을 구문 분석하고 분 수를 반환하는 함수가 있습니다. 문자열은 주, 시간, 일 및 분 수에 해당하는 형식 "5w6h2d1m"일 수 있습니다 w, h, d, m.

'테스트 규칙 당 1 개의 어설 션'을 따르려면 각 입력 변형에 대해 여러 번 테스트해야합니까? 어리석은 것처럼 보이므로 대신 다음과 같은 것이 있습니다.

self.assertEqual(parse_date('5m'), 5)
self.assertEqual(parse_date('5h'), 300)
self.assertEqual(parse_date('5d') ,7200)
self.assertEqual(parse_date('1d4h20m'), 1700)

하나의 테스트 사례에서. 더 좋은 방법이 있습니까?


가장 좋은 방법은 매개 변수를 사용하는 것입니다 (일부 프레임 워크는이 기능을 지원하며 모든 프레임 워크는 지원해야 함). 이 방법으로 단일 동작을 테스트하지만 많은 테스트 사례를 고려하고 오류가 발생할 경우 오류를 발생시킨 매개 변수 값을 확인할 수 있습니다.
Kemoda

답변:


23

테스트 "규칙"당 하나의 어설트를 보는보다 실용적인 방법은 단일 테스트에서 어설트를 단일 개념으로 처리하는 것입니다.

이런 식으로 단일 테스트에서 단일 개념을 테스트하고 있습니다. 귀하의 경우 입력 문자열이 단일 날짜로 올바르게 구문 분석되는지 여부입니다.

여러 가지 어설 션으로 단일 개념을 테스트하거나 여러 테스트에서 단일 어설 션을 사용하는 것이 더 나은지 확인하려면 사례별로 판단해야합니다.

테스트에서 더 명확한 테스트와 반복 횟수를 줄이면서도 테스트에서 분석법의 다양한 실패 지점을 강조 할 수있는 옵션을 찾으십시오. 무엇이 잘못되었는지 알아 내기 위해 테스트를 디버그하지 않고 정확히 어떤 일이 발생했는지 테스트가 실패 할 때 명확하게하기를 원합니다.


17

테스트 라이브러리에 크게 의존합니다. C # 라이브러리 NUnit에서 다음과 같은 작업을 수행 할 수 있습니다.

[TestCase('5m', 5)]
[TestCase('5h', 300)]
[TestCase('5d', 7200)]
[TestCase('1d4h20m', 1700)]
public void ParseDateTest(inputString, expectedMinutes)
{
    Assert.That(parse_date(inputString), Is.EqualTo(expectedMinutes));
}

testng가있는 Java에는 @DataProvider 메소드가 있습니다
Kemoda

이것이 최고의 솔루션 IMHO입니다. 거의 모든 언어에서 테스트를 매개 변수화 할 수 있습니다. java : @Parameterized , JunitParams , Zohhak
piotrek

3

예, 각 입력 변형에 대해 여러 테스트를 수행하십시오.

테스트 가이드 라인 당 하나의 어설 션의 주요 목표는 하나의 오류로 인해 하나의 테스트 실패가 발생하고 그 반대도 마찬가지이므로 실패한 사항을 정확하게 알 수 있습니다. 그런 다음 하나의 매우 정확한 테스트를 수행하여 근본 원인을 디버깅하고 확인할 수 있습니다. 한 번의 주장으로이 문제를 해결할 수 있으며 여러 번의 주장으로 괜찮을 수 있습니다. 이 특정 시나리오에서는 각 접미사와 몇 가지 주문 조합에 대한 테스트를 수행합니다.

테스트 격리가 이점 인 이유가 분명하기를 바랍니다. 문제가 발생했을 때 디버깅 시간이 줄어 듭니다. 이제 테스트가 실패 할 가능성이없고 테스트를 통한 헌팅 오버 헤드가 작다 는 것을 확신한다면 구현 시간을 절약하기 위해 한 번에 테스트하는 것이 합리적 일 수 있습니다.

그러나 역사는 코드를 읽거나 사용하는 비용으로 코드를 작성하는 시간을 절약하는 것이 가치 가 없다는 것을 보여주었습니다 . 따라서 지침.


1

순수 주의자들은 다른 입력 값에 대한 주장은 테스트 클래스 내에서 별도의 테스트 방법에 넣어야한다고 말한다. 그 이유 중 하나는 테스트 UI에 따라 개별 어설 션보다 개별 테스트 실패를 구분하기가 더 쉽기 때문에 실패 원인을보다 빨리 식별 할 수 있기 때문입니다.

JUnit으로 테스트 할 때 초기 String 인수와 함께 assert * 메소드 버전을 사용하여 동일한 테스트 메소드 내에서 하나의 어설 션을 다른 어설 션과 구별하여이 문제를 해결할 수 있습니다.

self.assertEqual("just minutes", parse_date('5m'), 5)
self.assertEqual("just hours", parse_date('5h'), 300)
self.assertEqual("just days", ('5d') ,7200)
self.assertEqual("days, hours, minutes", parse_date('1d4h20m'), 1700)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.