ExpectedException atribuut Visual Studio 2008 ja Visual Studio 2010 all

15.10.2009  |  Gunnar

Visual Studio 2010 Tänane kanne Visual Studio 2010 seeriast peaks meelt mööda olema neile, kes teste kirjutavad. Visual Studio 2010 toob endaga kaasa täiendused testidesse, mis võimaldavad lõpuks ometi Visual Studio 2010 enda teste kasutada.

Visual Studio 2008 testide probleemid

Visual Studio 2008 testid on probleemsed. Keegi kodanik tegi saatusliku otsuse järgida testide osas iganenud kontseptsiooni, millest isegi Microsofti arendajad kinni pole pidanud ning tulemuseks oli kasutuskõlbmatu testide tugi. Probleem seisneb selles, et Visual Studio 2008 testide mehanism pole võimeline System.Exception tüüpi vigu korrektselt käsitlema.

Mõned sõnad tausta kohta ka. Kunagi ammu pidi olema nii, et System.Exception on kõikide vigade baasklass, millest pärivad järgmised kaks põhilist vigade klassi: System.SystemException ja System.ApplicationException. Neist esimene oli mõeldud .Net raamistikku koosseisu kuuluvate klasside süsteemsete tõrgete jaoks ja teine kõikidele kasutajate kirjutatud rakendustele. Aga et System.Exception ei ole abstraktne klass, siis edasi võite juba ise mõelda, kas eeltoodust kinni ka peeti või mitte…

Vaatame näiteks järgmist testi.

[TestMethod]
[ExpectedException(typeof(Exception))]
public void ThisTestFails()
{
    throw new Exception("This test fails!");
}

Selle käivitamisel saame sellise tulemuse.

Visual Studio 2008: System.Exception tüüpi viga püüdev test ebaõnnestub

Veateade on järgmine: UTA017: TestProject1.UnitTest1.ThisTestFails has invalid ExpectedException attribute. The type must inherit from Exception. Seda ma käsitlen Visual Studio 2008 seni parandamata veana, sest System.Exception ei ole abstraktne klass ja sellest instantside loomist ei saa keelata ka FxCop või koodi analüüsimise vahenditega – kompilaator laseb selle klassi loomise ikkagi läbi.

Kuniks Visual Studio 2008 on viimane valmis versioon ja selle vea parandamisest pole tootja huvitatud, soovitan alternatiividena kasutada näiteks selliseid tooteid nagu nUnit või xUnit.

Visual Studio 2008 testide häkid

Visual Studio 2008 testide jaoks on olemas mõned häkid, mille abil testid kasutatavaks muutuvad. Mitte, et ma neid häkke soovitaksin – nende tulemuseks on siiski korralikult ära solgitud testide kood.

Aga et me eluteed võivad alati ristuda koodist kõike teadvate kodanikega, kes viimati nägid koodi 10 aastat tagasi ülikoolis põgusalt, kuid kes see-eest siiski programmeerimisest kõike teavad ja meie mõistes äärmiselt veidraid otsuseid teinekord peale suruvad, siis pakun välja taoliste haiguste üle elamiseks paar nõksu.

Esimene häkk seisneb selles, et muudame ära vea tüübi.

[TestMethod]
[ExpectedException(typeof(ApplicationException))]
public void ThisTestChangesExceptionType()
{
    try
    {
        throw new Exception("This test passes!");
    }
    catch (Exception ex)
    {
        throw new ApplicationException(ex.Message, ex);
    }
 
}

Teine häkk seisneb selles, et kontrollime vea tüüpi.

[TestMethod]
public void ThisTestUsesAssert()
{
    try
    {
        throw new Exception("This test passes!");
    }
    catch (Exception ex)
    {
        Assert.IsTrue(ex.GetType() == typeof(Exception));
    }
 
}

Ükskõik kumba neist häkkidest ei rakendaks, on tulemuseks õnnestuv test. Täpselt nii nagu näitab järgmine ekraanpauk.

Visual Studio 2008: Häkitud testid töötavad korrektselt

Aga rõhutan veelkord üle – kasutage neid teste ja häkke ainult juhul, kui peaprogrammeerija valikul on viga tehtud või keegi vaheastme juht on ennast progemises kompetentseks mõelnud ja teeb “suuri otsuseid”.

Visual Studio 2010 testid töötavad

Proovime nüüd Visual Studio 2010 peal käivitada testi, mis ootab System.Exception tüüpi vea tekkimist.

[TestMethod]
[ExpectedException(typeof(Exception))]
public void ThisTestExpectsException()
{
    throw new Exception("Visual Studio 2010 rocks!");
}

Tulemus on selline.

Visual Studio 2010: System.Exception ei tekita tõrkeid

Näeme, et kõik läks nii nagu ootasime.

Kokkuvõtteks

Kuigi kanne keskendus peamiselt Visual Studio 2008 testide probleemile ja pakkus välja paar räiget lahendust, on heaks uudiseks siiski see viimane lühike peatükk – Visual Studio 2010 testid on eeltutvustatud probleemidest vabad.

Kommenteeri

sulge
Saada link e-postiga

© DT 2012 | Creative Commons Attribution-Noncommercial 3.0 License | WordPress