Nový Unit Test Framework pro dotnet
Aleš Roubíček |
Přibližně před dvěma týdny byla vypuštěna první beta verze nového testovacího frameworku xUnit.net. Spousta lidí si říká, k čemu další framework – vždyť tu máme NUnit, MbUnit, MsTest – a navíc syntakticky nekompatibilní?
xUnit.net přináší eleganci, jednoduchost a zdravý rozum. Byly zrušeny SetUpy a TearDowny a nahrazuje je IDisposable pattern a konstruktor (jednoduše elegantní), pro každý test je vždy vytvořena nová instance testovací třídy. Asserty byly revidovány a duplicitní či zbytečné byly odebrány.
Framework je navržen tak, aby byl snadno rozšiřitelný o vlastní atributy, kterými můžete specifikovat vlastní akce (např. Authetifikaci) či požadavky. Součástí frameworku není žádný mockvací nástroj. K čemu také, když už tu máme skvělé Rhino Mocks?
Nové možnosti
Běžnou praxí je na testy zakládat samostatný projekt, takže jsou testy v samostatné assembly. Pokud jste chtěli mít testy společně v jednom projektu s výkonným kódem mohli jste tak taktéž učinit. Jenže pořád je tu problém, pokud z nějakého důvodu potřebujete testovat privátní věci. Sice to je ukázka toho, že něco smrdí, ale stejně se to občas může hodit.
xUnit.net totiž ruší atribut TestFixture/TestClass
a při spouštění test prohledává všechny třídy na přítomnost metod s atributem Test
. To nám umožňuje mít testovací metody v jedné třídě společně s výkonným kódem a testovat tak privátní členy bez nutnosti používat reflexi. Když už se k něčemu takovému rozhodnete je dobré ještě využít partial class
a testy přesunout do samostatného souboru např. Class.tests.cs
Soubor SomeClass.cs:
public partial class SomeClass {
private bool _isDirty;
private string _someText;
public string SomeText {
set {
_isDirty = true;
_someText = value;
}
}
}
Soubor SomeClass.tests.cs
public partial class SomeClass {
[Test]
private void SettingSomeTextMakesSomeClassDirty() {
var testInstance = new SomeCLass();
Assert.False(testInstance._isDirty);
testInstance.SomeTest = "text";
Assert.True(testInstance._isDirty);
}
}
Také je celkem dobré nechat takové testovací metody skryté před vnějším světem, tak že jim nastavíme modifikátor viditelnosti na private
. xUnit.net umí spouštět i privátní a interní metody za účelem testování (platí pro beta2 a novější).
Osobně se mi tento framework velice líbí a už jsem na něj přepsal testy pro Texy.net.