2011-01-27 5 views
19

두 객체를 허용하는 호출 가능 함수를 작성하고 해당 객체의 30 개 이상의 속성을 주장과 비교합니다. 이 문제는 약 20 개의 기존 단위 테스트와 대부분의 미래 테스트에 대해 수행해야하며 매번 30 개 이상의 주장을 작성하는 데는 시간과 공간이 모두 소모된다는 점이 문제입니다.nunit 테스트를 매개 변수화 할 수 있습니까

현재 개체를 비교하고 "통과"또는 실패 메시지와 함께 문자열을 반환하는 비 단위 테스트 기능이 있으며 각 단위 테스트에서이를 확인하기 위해 어설 션을 사용합니다. 그러나, 꽤 지저분한 나는 적절한 단위 테스트 방법에 반대하는 것처럼 느껴집니다.

조건을 확인하기 위해 어설 션을 사용하는 내부 테스트에서 호출 할 수있는 함수를 만드는 방법이 있습니까?

답변

17

가 마지막 부분에 대답하기 위해, 당신은 당연히있을 수있는 또 다른 함수 내에서 주장한다. 이는 테스트 러너 캐치 예외를 높여 일을 주장하고, 실패로 해석하고, 그래서 그렇게 잘 작동합니다 같은 시험이 있습니다

public void CheckAsserts(string value) 
{ 
    Assert.IsNotNull(value); 
} 

[TestCase("yes!")] 
public void MyTest(string value) 
{ 
    CheckAsserts(value); 
} 
+0

정확히 무엇을하려고했는지는 두 가지 매개 변수가 있습니다. 나는 내 문제라고 생각하는 테스트 케이스로서의 기능을 가졌다. 감사 – NewNetProgrammer

4

예, 단위 테스트는 다른 코드와 같습니다.

특히, NUnit.TestCaseAttribute을 확인하십시오.

+0

나는 그것에 대해 조사했지만 동적 매개 변수를 설정하는 방법을 알지 못했습니다. 20 개 이상의 수동으로 채워진 객체를 데이터베이스의 자동으로 채워진 객체와 비교하려고했습니다. Assert (테스트 케이스가 아닌)를 사용하여 void 함수를 생성하고 내 유닛 테스트에서 호출하는 것은 완벽하게 작동했습니다. 감사합니다 – NewNetProgrammer

32

NUnit 2.5.5 이상을 사용하는 경우 TestCase 속성을 사용하면 가능합니다.

보통 단위 테스트는 [테스트]로 장식 될 것이다, 그러나 우리는 다음과 같이 다음과 것으로 대체 할 수있다 : 일의

[TestCase("0", 1)] 
[TestCase("1", 1)] 
[TestCase("2", 1)] 
public void UnitTestName(string input, int expected) 
{ 
    //Arrange 

    //Act 

    //Assert 
} 

그 유형을 할 수있는 방법이 될 것입니다 - 분명히 다른 PARAMS을합니다. 도움이에서

봐 : http://nunit.org/?p=testCase&r=2.5

+0

문제는 내 테스트 사례가 정적이 아닙니다. 필자는 수동으로 채워진 개체와 비교할 데이터베이스에서 개체를 채 웁니다. – NewNetProgrammer

+0

'expected'는 매개 변수화 된 테스트의 리턴 유형이어야하며, 매개 변수 대신에 리턴 값을 테스트 케이스에 제공해야합니다. –

0

당신은 테스트 케이스 속성이 필요합니다 : 이것은 단지 문자열과의 int 같은 기본 데이터 형과 함께 작동

[TestCase("string1",...) 
public void test_UnitTest(string Parameter) 
{ 
    ... 
    Assert.AreEqual(Parameter, result) 
} 

주 - 당신은 인스턴스화 할 수 있습니다 자신의 클래스를 만들고 매개 변수로 사용하십시오.

+0

문제는 내가 비교하고 싶은 30 가지 이상의 속성을 가진 클래스를 사용하고 있습니다. – NewNetProgrammer

1

당신은 TestCase 속성을 사용할 수 있습니다 :

[TestCase("hostname1parameter")] 
[TestCase("hostname2parameter")] 
public void Example_TestHostName(string hostname) 
{ 
    ... 
} 
0

또한 C#을 성찰를 사용하여 혜택을 누릴 수 있습니다. 이렇게하면 코드에서 필드의 이름을 지정하지 않고 필드의 이름을 가져올 수 있습니다. 그런 다음 이름으로 호출 할 수 있습니다.

System.Attribute [] attrs = System.Attribute.GetCustomAttributes (t);

이렇게하면 아직 작성하지 않은 클래스에 적용될 특정 종류의 테스트를 작성할 수 있습니다.

관련 문제