문제

내가 사용하는 C#3.0NUnit.는지 궁금하네요가 있는 경우는 표준 방법에 대한 단위 테스트 수행하는 코드를 실행한 후 일부 양의 시간입니다.예를 들어,내가 간단한 정체되는 클래스가 등록할 수 있는 방법으로,그리고 그들을 불 n 됩니다.나는 것을 보장하기 위해 필요한 코드에 대한 방법입니다.

예를 들어,다음과 같은 테스트를 항상 통과하기 때문에 없는 주장은 이후까지 메소드가 종료됩니다.

[Test]
public void SampleTest()
{
    IntervalManager.SetTimeout(delegate{ 
        Assert.Equals(now.Millisecond + 100, DateTime.Now.Millisecond); 
    }, 100);
}

도 가능하다면 단위 테스트 코드는 실행되지 않습니다.

환호

도움이 되었습니까?

해결책

이건 어때? 이로 인해 콜백이 발사 될 예정인 최대 시간에 대한 테스트가 차단되고 구제되기 전에 완료되어 오류를보고합니다.

public void Foo() {
    AutoResetEvent evt = new AutoResetEvent(false);
    Timer t = new Timer(state => {
        // Do work
        evt.Set();
    }, null, 100, Timeout.Infinite);
    if (evt.WaitOne(500)) {
        // method called and completed
    } else {
        // timed out waiting
    }
}

다른 팁

그렇다면 정확히 무엇을 테스트하고 있습니까? 타이머가 작동한다는 테스트를하고 있습니까? 아니면 코드가 타이머를 올바르게 설정하여 만료시 타이머가 콜백을 실행합니까? 코드가 어떻게 보이는지 모르면 실제로 테스트하고 싶은 것이 후자라고 가정합니다. 내 대답은 (1) 아마도 정적 방법으로 어려울 것입니다. (2) 종속성 주입을 사용하고 실제로 결과 메소드를 실행하지 않고 기록하는 모의 타이머를 주입해야 할 것입니다. 코드에 의해 적절한 전화가 이루어질 것으로 예상됩니다.

부수적으로. 우리는 보통 느리게 달리는 테스트를 NUNIT 카테고리 일부 빌드에서 해당 테스트를 건너 뛰도록 선택할 수 있습니다.

예, 예에서처럼하는 것은 작동하지 않습니다.

오히려, 나는 당신이 테스트 클래스를 만들고, 대의원으로 사용하고, 그 방법이 호출되었을 때, 그리고 몇시에 그 기록을 기록하는 것이 좋습니다.

그런 다음 테스트하려는 간격 관리자에 모의를 주입합니다. 그런 다음 테스트 방법이 IntervalManager (IntervalManager가 제공 한 적절한 방법을 사용하거나 몇 초만 기다리면)를 기다려야한다면 테스트 클래스의 상태를 확인할 수 있습니다.

BTW,이 접근법은 일반적으로 다음을 지칭합니다 조롱; 이 경우 테스트 클래스는 모의 개체입니다.

다른 몇 가지 답변에서 알 수 있듯이 장기 실행 테스트는 일반적으로 나쁜 생각입니다. 이 구성 요소 테스트를 용이하게하려면 테스트하려는 두 가지 다른 것들이 실제로 있다는 것을 고려해야합니다.

  1. 시간이 정한 대의원 실행을 등록하면 적절한 시간이 설정됩니다. 이것은 다양한 시간 초과 조합과 대의원 수로 테스트해야 할 것입니다.
  2. 대의원은 적절한 방식으로 실행됩니다.

방식으로 테스트를 분리하면 타이밍 메커니즘이 적은 수의 짧은 시간 초과 (고려해야 할 모든 경우 테스트)에서 예상대로 작동하는지 테스트 할 수 있습니다. 시스템의 현재로드와 구성 요소 코드가 얼마나 복잡한 지 (즉 IntervalManager).

물론 테스트 할 수 있습니다. 실행을 기다려야합니다.

어쩌면 나는 뭔가가 있지만,Visual Studio 의 단위 테스트에는 특별한 속성에 넣을 수 있는 방법을 제어하는 실행 순서와는 다른 것들입니다.이되어 있어야할 때 자동으로 생성되 첫 번째 유닛 테스트 프로젝트:

    #region Additional test attributes
    // 
    //You can use the following additional attributes as you write your tests:
    //
    //Use ClassInitialize to run code before running the first test in the class
    //[ClassInitialize]
    //public static void MyClassInitialize(TestContext testContext) {
    //}
    //
    //Use ClassCleanup to run code after all tests in a class have run
    //[ClassCleanup()]
    //public static void MyClassCleanup()
    //{
    //}
    //
    //Use TestInitialize to run code before running each test
    //[TestInitialize()]
    //public void MyTestInitialize()
    //{
    //}
    //
    //Use TestCleanup to run code after each test has run
    //[TestCleanup()]
    //public void MyTestCleanup()
    //{
    //}
    //
    #endregion

그래서 사용[ClassInitialize]해야 할 수 있는 실행하는 첫번째로 방법입니다.그런 테스트를 실행할 수 있습니다.또는 사용할 수 있[TestInitialize]코드를 실행하기 전에 테스트입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top