A tesztelés célja, hogy biztosítsa a rendszer helyes működését, azonosítsa az esetleges hibákat,
és elősegítse a minőség javítását.
A tesztelési szintek segítenek abban, hogy a rendszert rétegekre bontva,
lépésről lépésre ellenőrizzük.
Az alábbiakban áttekintjükk a tesztelés legfontosabb szintjeit.

Unit teszt:
    Egyes függvények, metódusok tesztelése.
    Célja, hogy egy kisebb egység (metódus vagy osztály) működését verifikálja.

Modul vagy komponenes teszt 
    Több, összefüggő unit tesztet foglal magában.
    Különböző osztályok vagy metódusok integrálása.

Integrációs teszt:
    Két vagy több modult, rendszert tesztel, hogy biztosítja e azok együttműködését.

Rendszerteszt
    Az egész rendszer működését vizsgálja,
    teljes funkcionalitással.

Átviteli teszt:
    A végfelhasználó által elfogadott teszt, amely az üzleti igényeket validálja.

Unit teszt
    Célja
        Egy adott kód egység tesztelése
        Az egység izolált vizsgálata, hogy az önállóan helyesen működik e

    Jellemzői
        Fejlesztő által írt tesztek
        Általában autómatikusan futtatott tesztek
        Segítenek a hibák gyors azonosításában, és csökkentik a későbbi tesztelési költségeket.

    Eszközök
        C# esetén népszerű keretrendszer az NUnit, xUnit, vagy MSTest

Modul vagy komponenes teszt
    Célja
        Egy modul vagy komponens tesztelése (amely több egységet foglal magában)
        Az egységek közötti kapcsolat és a modul helyes működésének ellenőrzése

    Jellemzői
        Több egységből álló részegységeket vizsgálat
        Izolált, a többi modultól független tesztelésre törekszik
        KLülönösen fontos az objektumorientált rendszerekben

Integrációs teszt
    Célja
        Több komponens vagy modul együttműködésének tezstelése.
        Biztosítja, hogy a különböző részek helyesen kommunikálnak egymással

    Jellemzői:
        Nem izolált, hanem több komponens együttes vizsgálatát jelenti.
        Külső rendszerek vagy adatbázisok is bevonhatók.

    Eszközök:
        Mocking keretrendszerek használata, mint a Moq, vagy NSubstitute.

Rendszerteszt
    Célja
        A teljes rendszer együttes vizsgálata a felhasználói követelményekk alapján
        Annak ellenőrzésére hogy a rendszer az elvárt funkciókat teljesíti.
    
    Jellemzői
        A tesztkörnyezet hasonlít az éles környezethez.
        Funkcionális és nem funkcionális teszteket egyaránt tartalmaz (teljesítmény,biztonság)

    Eszközök:
        Selenium (automata tesztekhez webes környezet)
        JMeter (teljesítményteszteléshez)

Átviteli teszt
    Célja
        Annak biztosítása hogy a rendzser megfelel az üzleti követelményeknek és a felhasználói elvárásoknak.
        A fejlesztls befejezésének  hivatalos felvétele.

    Jellemzői
        Üzleti szakértők vagy végfelhasználók végezhetik
        Az éles környezetben történő működés próübája

    Típusai:
        felhasználói átviteli teszt (User Acceptance Testing UAT)
            végfelhasználók végzik
        Szerződéses teszt:
            üzleti szerződéses feltételek ellenőrzése
        Regressziós teszt:
            Biztosítja hogy a frissítések ne okozzanak hibát a rendszerben

Tesztelési szintek kapcsolata
    A tesztelési szintek hierarchiája biztosítja, hogy a rendszer fejlesztése során fokozatosan kerüljenek feltárására és javítására a hibák
    
    Unit tesztek az alapok gyorsak izoláltak kicsik
    Modul tesztek kiterjedtebbek több függvényt vizsgálnak eggyszerre
    integrációs tesztek
    rendszertesztelés
    átviteli tesztek

Tesztelési állítások
    néhány használt assert metódus

    AreEqual
    AreNotEqual
    IsNull
    IsNotNull
    IsTrue
    IsFalse

Assert.AreEqual(expected, actual)
    Ellenőrzi, hogy a várt expected és a tényleges érték megegyezik e.
    Ha nem a teszt sikertelen lesz.

    [TestMethod]
    public void AddTwoNumberS(){

        //ARRANGE
        var calc = new Calc();
        //act
        int result = calc.Add(3,5);
        //assert
        Assert.AreEqual(8,result);
    }

IsTrue
    public void IsNumberPositive_ReturnsTrue(){
        int number = 10;

        Assert.IsTrue(number > 0);
    }

IsFalse
    public void IsNumberNegative_ReturnsFalse(){
        int number = 10;

        Assert.IsFalse(number < 0);
    }

IsNull
    public void Object_ShouldBeNull(){
        object obj = null;

        Assert.IsNull(obj);
    }

IsNotNull
    public void Object_ShouldNotBeNull(){
        object obj = null;

        Assert.IsNotNull(obj);
    }

Assert.ThrowsException<T>

public void Withdraw_Insufficient_Balance_ThrowsException(){
    var Account = new BankAccount(50);

    Assert.ThrowsException<InvalidOperationException>(() => Account.Withdraw(100));
}

Mikor használjuk?
    AreEqual
        függvények visszatérési értékének ellenőrzésére
    IsTrue, IsFalse
        feltételek vizsgálata
    IsNotNull, IsNull
        Null tesztelés
    ThrowsException
        kivételdobás

AAA minta (Arrange - Act - Assert) egy általnosan használt struktúra
az unit tesztek írásakor, amely segít a tesztek átlátahtóságában és olvashatóságában.
A három lépés jelentése:
    Arrange előkészítés:
        A teszt környezet és szükséges adatok előkészítése.
    Act Végrehajtása:
        A tesztelendő metódus vagy osztály meghívása
    Assert ellenőrzés:
        Az eredmény ellenőrzése, az elvárt és kapott érték összehasonlítása