2011-11-17 4 views
9

단위 테스트를 사용하는 법을 배우고 있습니다. 프로젝트를 만들고 xunit 참조를 추가합니다. 그리고 다음 코드 : 난 xUnit의 GUI를 도구를 사용하여 테스트를 실행하면xunit가 매개 변수가있는 메소드를 테스트 할 수없는 이유는 무엇입니까?

namespace UnitTestProject 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     [Fact] 
     private void test(int number1, string number2) 
     { 

      int result = number1 + Convert.ToInt32(number2); 
      Assert.IsType(Type.GetType("Int32"), result); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

, 그것은 말했다 :

UnitTestProject.Form1.test : System.InvalidOperationException : 사실 방법 UnitTestProject.Form1.test 수 없어 於 Xunit.Sdk.FactCommand.Execute (TestClass에 객체)
Xunit.Sdk.FixtureCommand.Execute (객체의 TestClass)
Xunit.Sdk.BeforeAfterCommand.Execute (TestClass에 객체): 매개 변수 스택 추적을 Xunit.Sdk.LifetimeCommand.Execute (객체의 TestClass)
Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute (객체의 TestClass는) 그래서

, 내가 어떻게 매개 변수를 사용하는 방법/기능을 테스트 할 수 있습니다?

답변

18

가능합니다. 다른 매개 변수로 테스트 메소드를 작성할 수 있습니다. 예.

[Theory] 
[InlineData(1, "22")] 
[InlineData(-1, "23")] 
[InlineData(0, "-25")] 
public void test(int number1, string number2) 
{ 
    int result = number1 + Convert.ToInt32(number2); 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

p.s. xUnit을 사용하면 테스트 메소드를 공개하는 것이 더 좋습니다.

+0

감사하지만 InlineData를 무작위 값으로 설정할 수 있습니까? 아니면 InlineData가 인라인 메서드/변수를 사용할 수 있습니까? – Cheung

+0

이유가 없습니다. 아래의 더러운 예제를보십시오. – Alina

+1

@Shiba 일반적으로 테스트에서 임의 값을 사용하면 안됩니다. 예를 들어, 하나의 난수가 실패하면 문제의 원인이 무엇인지 알 수 없습니다. 테스트를 결정적으로 만들어보고 예상치 못한 예상치 못한 극한의 입력을 제공하십시오. – DaveShaw

2

xunit은 인수의 값으로 무엇을 제공해야하는지 어떻게 알 수 있습니까? 단위 테스트는 데이터가있는 환경을 설정하고 필요한 조치를 취한 다음 결과가 예상되는 것으로 주장하는 자체 포함 된 테스트 여야합니다. 귀하의 테스트는 number1number2의 외부 값에 의존하기 때문에 자체 포함되지 않습니다. 다음보십시오 :

[Fact] 
private void TestAdd() { 
    //arrange 
    int number1 = 10; 
    string number2 = "10"; 

    //act 
    object result = Add(number1,number2); 

    //assert 
    Assert.IsType(Type.GetType("Int32"), result); 
} 

private object Add(int number1, string number2) 
{ 
    return number1 + Convert.ToInt32(number2); 
} 

뭔가주의하는, 당신이 (매개 변수 단위 테스트)를 수행하려고하는 것은 또한 당신이 [Theory] 대신 [Fact]을 사용할 수 있습니다 Pex 도구

+0

감사합니다. 그러나 오늘날 많은 응용 프로그램이 최종 사용자와 상호 작용합니다. 예를 들어, 제 업무는 주로 계좌 시스템, 재고 시스템에서 일하는 것을 좋아합니다. 나는 사용자의 입력 데이터를 추측 할 수 없다. 나는 그것에서 새롭, 아직도 단위 테스트의 가치를 찾아 내. – Cheung

+2

함수는 특정 데이터 범위를 수용해야합니다. 일반적으로 해당 범위의 oulier, 예외적 인 경우를 테스트 한 다음 해당 범위 내의 항목 (정상 성)을 테스트합니다. 하지만 Pex를 확인해보십시오. 함수를 테스트 할 수있는 입력 데이터가 생성됩니다. – flipchart

+0

감사합니다. Pex가 내가 원하는 것 같습니다. – Cheung

14

테스트에서 임의의 값 및 인라인 메서드/변수 정보. 이 코드는 테스트를 위해 100 개의 임의의 int/string 쌍을 생성합니다.

[Theory] 
    [PropertyData("GetTestData")] 
    public void test(int number1, string number2) 
    { 

     int result = number1 + Convert.ToInt32(number2); 
     var expectedType = Type.GetType("System.Int32"); 
     Assert.IsType(expectedType, result); 
    } 

    public static IEnumerable<object[]> GetTestData 
    { 
     get { return Enumerable.Repeat(0, 100).Select(x => GenerateTestData()); } 
    } 

    private static object[] GenerateTestData() 
    { 
     var rand = new Random(0); 
     return new object[] {rand.Next(0,100), rand.Next(0,100).ToString()}; 
    } 
+0

대단히 고마워! – Cheung

+0

당신을 진심으로 환영합니다. – Alina

+0

하지만 왜? 실패하면 재현 할 수 없습니다. 테스트에서 수정 한 후에 임의의 값으로 세트를 생성하십시오. –

관련 문제