IT TIP

datetime을 사용한 Nunit 매개 변수화 된 테스트

itqueen 2020. 12. 13. 11:32
반응형

datetime을 사용한 Nunit 매개 변수화 된 테스트


누군가 nunit으로 갈 수 없다고 말할 수 있습니까?

[TestCase(new DateTime(2010,7,8), true)]
public void My Test(DateTime startdate, bool expectedResult)
{
    ...
}

나는 정말로 datetime거기 에 넣고 싶지만 그것을 좋아하지 않는 것 같습니다. 오류는 다음과 같습니다.

속성 인수는 상수 표현식, typeof 표현식 또는 속성 매개 변수 유형의 배열 생성 표현식이어야합니다.

내가 읽은 일부 문서는 당신이 할 수 있어야한다고 제안하는 것 같지만 어떤 예도 찾을 수 없습니다.


이 작업을 수행 하려면 ValueSource 속성 과 같은 것을 사용 합니다.

public class TestData
{
    public DateTime StartDate{ get; set; }
    public bool ExpectedResult{ get; set; }
}

private static TestData[] _testData = new[]{
    new TestData(){StartDate= new DateTime(2010,7,8), ExpectedResult= true}};

[Test]
public void TestMethod([ValueSource("_testData")]TestData testData)
{
}

그러면 _testData 컬렉션의 각 항목에 대해 TestMethod가 실행됩니다.


이것은 약간 늦은 답변이지만 가치가 있기를 바랍니다.

TestCase속성 에서 상수 문자열로 날짜 를 지정한 다음 DateTime메서드 서명에서와 같이 유형을 지정할 수 있습니다.

NUnit은 DateTime.Parse()전달 된 문자열에 대해 자동으로 수행합니다 .

예:

[TestCase("01/20/2012")]
[TestCase("2012-1-20")] //same case as above in ISO format
public void TestDate(DateTime dt)
{
    Assert.That(dt, Is.EqualTo(new DateTime(2012,01,20)));
}

문서화 된대로 TestCaseData 클래스를 사용해야합니다. http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9

다음과 같은 예상 결과를 지정하는 것 외에도

 new TestCaseData( 12, 4 ).Returns( 3 );

예상되는 예외 등을 지정할 수도 있습니다.

 new TestCaseData( 0, 0 )
    .Throws(typeof(DivideByZeroException))
    .SetName("DivideByZero")
    .SetDescription("An exception is expected");

또 다른 대안은보다 자세한 접근 방식을 사용하는 것입니다. 특히 내가 반드시 미리 알지 DateTime()못한다면, 주어진 문자열 입력이 어떤 종류의 (만약 있다면 ...) 산출합니다.

[TestCase(2015, 2, 23)]
[TestCase(2015, 12, 3)]
public void ShouldCheckSomething(int year, int month, int day)
{
    var theDate = new DateTime(year,month,day);
    ....
} 

... 참고 TestCase는 최대 3 개의 매개 변수를 지원하므로 더 필요합니다.

private readonly object[] testCaseInput =
{
    new object[] { 2000, 1, 1, true, "first", true },
    new object[] { 2000, 1, 1, false, "second", false }
}

[Test, TestCaseSource("testCaseInput")]
public void Should_check_stuff(int y, int m, int d, bool condition, string theString, bool result)
{
....
}

NUnit은 TestCase (s)에서 원시가 아닌 객체의 초기화를 허용하지 않는 것 같습니다. TestCaseData 를 사용하는 것이 가장 좋습니다 .

테스트 데이터 클래스는 다음과 같습니다.

public class DateTimeTestData
{
    public static IEnumerable GetDateTimeTestData()
    {
        // If you want past days.
        yield return new TestCaseData(DateTime.Now.AddDays(-1)).Returns(false);
        // If you want current time.
        yield return new TestCaseData(DateTime.Now).Returns(true);
        // If you want future days.
        yield return new TestCaseData(DateTime.Now.AddDays(1)).Returns(true);
    }
}

In your testing class you'd have the test include a TestCaseSource which directs to your test data.

How to use: TestCaseSource(typeof(class name goes here), nameof(name of property goes here))

[Test, TestCaseSource(typeof(DateTimeTestData), nameof(GetDateTimeTestData))]
public bool GetDateTime_GivenDateTime_ReturnsBoolean()
{
    // Arrange - Done in your TestCaseSource

    // Act
    // Method name goes here.

    // Assert
    // You just return the result of the method as this test uses ExpectedResult.
}

참고URL : https://stackoverflow.com/questions/7114604/nunit-parameterized-tests-with-datetime

반응형