Na obsah stránky

Nový Unit Test Framework pro dotnet

Aleš Roubíček | | # permalink

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.

Našli jste v článku chybu? Máte námět na reportáž? Založte mi ticket.