Vraag xUnit Async-test werkt niet goed


We gebruiken xUnit Framework al sinds het begin als testraamwerk in ons project. Momenteel zijn er 2200+ unit tests in het project en alles lijkt in orde.

Maar gisteren heb ik besloten om unit tests uit te voeren bij CI-builds en nachtelijke builds. Vechten met teambuilding-controller om xunit-tests gedurende 1-2 uur uit te voeren, slaag er in om tests uit te voeren. Maar er was een probleem, er zijn 22 waarschuwingstests zoals hieronder, - Xunit.Sdk.EqualException: Assert.Equal () mislukking of - System.ArgumentNullException: waarde kan niet nul zijn.

Na wat meer onderzoek realiseerde ik me dat deze tests moesten worden mislukt, maar lijkt geslaagd omdat al deze tests zijn gemarkeerd met "async" trefwoord.

Eigenlijk zou er geen enkele fout mogen zijn, omdat xUnit async-testen ondersteunt met betrekking tot deze berichten http://bradwilson.typepad.com/blog/2012/01/xunit19.html http://sravi-kiran.blogspot.com.tr/2012/11/UnitTestingAsynchronousMethodsUsingMSTestAndXUnit.html De realiteit van Howerver is voor mij een kleiner verschil. Ja, xUnit werkt zonder enig probleem maar test niet goed.

Hier zijn twee kleine methoden.

public async Task<string> AsyncTestMethod() {
    throw new Exception("Test");
}
public string NormalTestMethod() {
    throw new Exception("Test");
}

Omdat je alleen verschil kunt zien, is de eerste methode gedefinieerd als "async" En hier zijn twee tests voor deze methoden.

  [Fact]
    public async void XunitTestMethod_Async() {
        Program p = new Program();
        string result = await p.AsyncTestMethod();
        Assert.Equal("Ok", result);
    }
        [Fact]
    public  void XunitTestMethod_Normal() {
        Program p = new Program();
        string result =  p.NormalTestMethod();
        Assert.Equal("Ok", result);
    }

Beide oorspronkelijke methoden werpen een uitzondering, dus ik denk dat beide tests mislukken, maar het resultaat is anders. U kunt de resultaten zien: Test results

XunitTestMethod_Async testpas maar XunitTestMethod_Normal mislukt. Het weggooien van een uitzondering is niet het geval, u kunt de inhoud van de methode wijzigen, wat u maar wilt AsyncTestMethod wordt altijd doorgegeven.

Hier is de voorbeeldoplossing: https://github.com/bahadirarslan/AsyncTestWithxUnit

Ik kan verkeerd begrepen of verkeerd denken, maar nu veroorzaakt dit gedrag veel pijn voor mij

Ik hoop dat je me kunt verlichten.

PS: Ik heb een probleem gemaakt op de pagina xUnit github, maar ik wist niet zeker of dit veroorzaakt werd door mij of xUnit. Dus besloot ik om hier ook te vragen. Kwestie: https://github.com/xunit/xunit/issues/96


15
2018-05-23 08:42


oorsprong


antwoorden:


Het probleem is dat async void methode retourneert geen a Task object dat xUnit mogelijk voor uitzonderingen zou kunnen onderzoeken. xUnit kan zelfs de voltooiing van een bepaald niet volgen async void methode, in tegenstelling tot een async Task methode.

Bovendien, async void methoden werpen geen uitzonderingen op hetzelfde stapelframe, zelfs voor uitzonderingen die worden gegooid uit het synchrone gedeelte van de methode. In plaats daarvan worden uitzonderingen doorgegeven aan de huidige synchronisatiecontext SynchronizationContext.Post (in geval dat SynchronizationContext.Current != null), of anders via ThreadPool.QueueUserWorkItem. Dit gedrag is anders dan async Task methoden, meer details. Het is mogelijk om het totale aantal in behandeling zijnde te volgen async void methoden (via SynchronizationContext.OperationStarted/OperationCompleted), maar geen individuele methoden.

Dus, het veranderen van de XunitTestMethod_Async methode handtekening van async void naar async Task zou het probleem moeten oplossen.


30
2018-05-23 11:03