2012-09-20 8 views
5

Ich habe eine Situation, in der ich einen Komponententest verwende, um ein externes Tool auszuführen, das einen Test durchführt. Ich kann anhand des Exit-Codes des Tools feststellen, ob der Test bestanden, fehlgeschlagen oder abgelaufen ist.Programmgesteuertes Timeout eines Tests in MSTest

Gibt es eine Möglichkeit, dass ich den Komponententest nicht bestehen kann, wodurch das Testergebnis auf Timeout gesetzt wird und nicht fehlschlägt?

Ich habe versucht, eine TimeoutException zu werfen, aber dies hat das gleiche Ergebnis wie die Verwendung einer Assert.

Bearbeiten: Wir verknüpfen die Unit-Tests mit Testfällen in TFS. In Microsoft Test Center kann ein Test in einem Testlauf viele Zustände haben. Einer davon ist der Timeout-Status. Ich versuche, meinen Test zu versagen, so dass er in diesem Zustand korrekt angezeigt wird und sich nicht mit den fehlgeschlagenen Testfällen verbindet.

+0

Wenn Ihr Test auf einem externen Tool setzt dann einige Arbeit zu tun. Im Idealfall würden Sie sich über das externe Tool lustig machen, damit Sie * Ihren * Code testen können, unabhängig davon, ob * ihr * Code wie erwartet funktioniert. –

+4

@Jamie: Das ist pingelig. Er macht wahrscheinlich einen Integrationstest, aber (wie viele andere Leute) nennt es einen Komponententest, nur weil er in einem Testläufer läuft. – erikkallen

+0

Er könnte @erikkallen sein, aber er könnte auch beabsichtigen dies als Unit Test zu schreiben, aber er versteht es nicht richtig zu spotten oder zu wissen, dass es sogar eine Sache ist. Im letzteren Fall könnte mein Kommentar das OP in eine nützliche Richtung lenken, wenn nicht, würde es keinen Schaden anrichten. –

Antwort

1

In Unit-Tests verfügen Sie über 2 Farben: grün und rot. Es gibt keine Timeout Farbe.

Also ich denke, man manuell den Test bei externen Tools Timeouts fehlschlagen könnte:

Assert.Fail("External tool used to do this test timed out"); 

Die Art und Weise zu erkennen, dass Ihre externe Tools abgelaufen wird natürlich auf dem externen Gerät ab, die Sie verwenden, und wie Sie es aus Ihrem Komponententest heraus aufrufen.

+0

Sehen Sie sich das Microsoft Test Center an und Sie werden mehr als nur Grün und Rot finden. Wenn ein Test zu lange dauert (Zeitüberschreitung), erhalten Sie auch Gelb. – Christo

+0

Ich bin versucht, diese Antwort zu bewerten, da ich denke, dass es von der Frage (sogar in der ursprünglichen Form) klar ist, dass es genau das ist, was ich frage und dass ich bereits überlegt habe, eine Assert zu verwenden. – Christo

0

Ihr Ansatz, der eine TimeoutException wirft, scheint eine gute Wahl zu sein. Die TimeoutException stammt jedoch nicht von UnitTestAssertException.

Sie können einen der folgenden Dinge tun:

  1. ein AssertFailedException Werfen Sie den Grund als Zeichenfolge, die angibt.

  2. Unterklasse UnitTestAssertException mit einem benutzerdefinierten UnitTestTimeOutException und werfen Sie das.

  3. Verwenden Sie Assert.Fail als @ Darin-Dimitrov suggested.

1

Es ist nicht wirklich "programmatisch" aber man kann:

Ihr Test sollte nur warten, wenn es, dass das externe Werkzeug mit der Zeit heraus Code Ausgang zurückkehrt erkannt (dies ist der „programmatische“ Teil wäre.)

So ist der Test-Framework wird eingestellt das Testergebnis zu "Timeout" für Sie.

Vor allem, wenn Ihre Tests automatisiert sind, wäre es eine geeignete Lösung, nehme ich an.

12

Sie können Zeitlimit pro Test, mit Zusatz von Timeout (ms) im Test Attribute ...

[TestMethod, Timeout(2000)] 

-Test schlägt fehl, wenn die Ausführung dauert länger als 2 Sekunden eingestellt. es ist kein Unit-Test

Dank Marko

Verwandte Themen