testy jednostkowe VS


Testowanie jednostkowe
Testowanie jednostkowe
w Visual Studio 2012
w Visual Studio 2012
Testowanie jednostkowe
Metoda polegająca na
osobnym testowaniu
każdej pojedynczej
jednostki oprogramowania
jak na przykład funkcja
albo klasa.
Jest to bardzo proste,
polega na zadaniu
testowanemu fragmentowi
wybranych wartości i
porównanie wyniku
otrzymanego z wynikiem
poprawnym.
Na przykład badając funkcję dodającą zadanymi
parametrami może być 4 i 5 a wartością oczekiwaną będzie
9.
Test polega na sprawdzeniu, czy wartość zwrócona przez
funkcję jest równa wartości oczekiwanej (którą sami
ustalamy), jeżeli tak to test zostanie uznany za zdany.
Ważne jest testowanie warunków granicznych, gdyż to przez
nie zdarza się dużo błędów.
Dla przykładu: jeżeli badamy fragment kodu, który przyjmuje
wartości int od 30 do 100, to ważne jest aby zrobić testy, które
sprawdzają działanie tego fragmentu dla wartości 29, 30, 31,
99, 100, 101.
Poza tym badamy jeszcze wartości ze środka i spoza tego
przedziału.
Testy jednostkowe
pozwalają na duże zmiany
w kodzie w szybkim czasie.
Ma się pewność, że coś
działa, bo testy wykonują
się poprawnie.
Po każdej wprowadzonej
zmianie w kodzie należy
uruchomić testy, wtedy od
razu wiadomo, czy ta
zmiana nie spowodowała
jakichś błędów i można je
od razu poprawić.
To oszczędza czas!!!
Właściwości poprawnych testów
jednostkowych
Automatyzacja
Dotyczy uruchamiania i sprawdzania wyników
testów.
Kompletność
Muszą testować wszystko, co może zawieść.
Powtarzalność
Powinny być niezależne od siebie i od
środowiska  wielokrotne wykonywanie testów,
nawet w różnej kolejności, powinno dać zawsze
takie same wyniki.
Niezależność
Przeprowadzenie testu nie może zależeć od
wyników innego testu
Powinny się koncentrować na testowanej w danej
chwili metodzie, oraz być niezależne od
środowiska i innych testów.
Profesjonalizm
Brak testów dla fragmentów, które nie są istotne
Kod testujący powinien spełniać te same
wymagania, co kod testowany.
Muszą być przestrzegane zasady poprawnego
projektowania.
Liczba wierszy kodu testującego porównywalna z
liczbą wierszy kodu testowanego.
Do testowania używamy frameworka instalowanego razem z
Visual Studio, potrzebne pliki nagłówkowe i biblioteki
znajdują się w w:
VisualStudio2012[x86]InstallFolder\VC\UnitTest\include
VisualStudio2012[x86]InstallFolder\VC\UnitTest\lib
Instrukcja tworzenia testu
W oknie Solution Explorer klikamy prawym przyciskiem myszy na
solucje zawierającą testowany projekt i wybieramy Add New
Project Visual C++ Test Native Unit Test Project
W nowo powstałym
projekcie w katalogu
Source Files znajduje się
plik unittest1.cpp w nim
znajduje się już ogólny
zarys testu, który należy
uzupełnić. Jeżeli chcemy
dodać więcej testów
klikamy prawym
przyciskiem myszy na
katalog Source Files a
potem Add New Item
Visual C++ Test C++
Unit Test Class
Do projektu z testami trzeba dodać ścieżkę do
testowanego projektu:
Klikamy prawym przyciskiem myszy na nazwę projektu z
testami i wybieramy References Common Properties
Framework and References i wybieramy Add New
Reference.
Klikamy na Projects
i dodajemy projekt,
który chcemy
testować.
Klikamy prawym
Potrzebujemy też dodać
przyciskiem myszy na
ścieżkę do pliku
nazwę projektu z testami i
nagłówkowego
wybieramy
zawierającego
prototypy/deklaracje
Properties VC++
testowanych fragmentów
Diretories i w polu
kodu.
Include Directories
dodajemy ścieżkę do
folderu zawierającego pliki
nagłówkowe testowanego
projektu.
(Musimy też dołączyć ten
nagłówek do pliku z
testami za pomocą
dyrektywy  include )
Teraz potrzebujemy dodać ścieżkę do plików nagłówkowych i
bibliotek potrzebnych do wykonania testu (lokalizacja tych
plików znajduje się na wcześniejszym slajdzie):
Sposób pierwszy:
W Properties VC++ Diretories w polu Include
Directories dodajemy ścieżkę do plików nagłówkowych.
W W Properties VC++ Diretories w polu Library
Directories dodajemy ścieżkę do bibliotek
Sposób drugi:
Kopiujemy pliki nagłówkowe do lokalizacji:
VisualStudio2012[x86]InstallFolder\VC\include
Kopiujemy biblioteki do lokalizacji:
VisualStudio2012[x86]InstallFolder\VC\lib
Teraz już możemy zbudować naszą solucje. Należy przy tym
pamiętać o jednej ważnej rzeczy:
Projekty testowane muszą być skompilowane jako
pliki .lib a projekty zawierające testy jako pliki .dll
Ustawia się to klikając
prawym przyciskiem myszy
na nazwę projektu, a potem:
Properties Configuration
Properties General
Configuration Type w tym
polu wybieramy .dll albo .lib
zależnie od rodzaju projektu,
a następnie kompilujemy całą
solucję.
Żeby uruchomić testy musimy
mieć otwarte okno Test Explorer,
znajduje się ono w menu: Test
Windows Test Explorer. W tym
oknie powinna od razu pojawić się
lista wszystkich napisanych testów,
zatem wybieramy przycisk Run All
i czekamy na efekty.
Jeżeli zaznaczymy
opcje Run Tests
After Build to testy
będą automatycznie
uruchamiały się po
skompilowaniu
projektu z testami,
bądz całej solucji.
Po wykonaniu
wszystkich testów
pokaże się lista które
z nich zostały zdane, a
które nie oraz
szczegóły dotyczące
tych niezdanych.
Istotne informacje:
W obszarze klasy można dodać kilka metod testujących (jedna
metoda to jeden test).
Test powinien obejmować jak najmniejszą, niepodzielną część.
Nie należy modyfikować testów. Jeżeli chcemy przetestować
jedną funkcję dla różnych zestawów parametrów wejściowych
to dla każdego zestawu tworzymy jeden test.
Zdanych testów nigdy nie modyfikujemy ani nie usuwamy,
ponieważ kolejne zmiany w programie mogą powodować, że
przetestowane już funkcjonalności mogą przestać działać
poprawnie.
Pisanie testów
Po otworzeniu pliku unittest1.cpp jego
zawartość będzie wyglądała następująco:
W metodzie TEST_METHOD implementujemy test pamiętając, aby
jedna metoda stanowiła jeden test. Testów wewnątrz jednej klasy,
jak i samych klas w pliku może być wiele, również przestrzeni nazw
może być więcej niż jedna - jest to przydatne w grupowaniu
podobnych testów.
Metody inicjuaizujące i czyszczące
Poniższe metody umieszczamy w klasie, każda z nich może wystąpić tylko
raz:
TEST_METHOD_INITIALIZE(methodName)  metoda inicjalizująca metody
TEST_METHOD_CLEANUP(methodName)  metoda czyszcząca metody
TEST_CLASS_INITIALIZE(methodName)  metoda inicjalizująca klasy
TEST_CLASS_CLEANUP(methodName)  metoda czyszcząca klasy
Poniższe metody umieszczamy w przestrzeni nazw, każda z nich może
wystąpić tylko raz:
TEST_MODULE_INITIALIZE(methodName)  metoda inicjalizująca moduły
TEST_MODULE_CLEANUP(methodName)  metoda czyszcząca moduły
Przykład jak będzie wyglądało to w kodzie testu:
namespace UnitTest1
{
TEST_MODULE_INITIALIZE(moduleInit)
{Logger::WriteMessage("Module Initialize\n");}
TEST_MODULE_CLEANUP(moduleClean)
{Logger::WriteMessage("Module Cleanup\n");}
TEST_CLASS(UnitTest)
{
public:
TEST_CLASS_INITIALIZE(classInit)
{Logger::WriteMessage("Class Initialize\n");}
TEST_CLASS_CLEANUP(classClean)
{Logger::WriteMessage("Class Cleanup\n");}
TEST_METHOD_INITIALIZE(methodInit)
{Logger::WriteMessage("Method Initialize\n");}
TEST_METHOD_CLEANUP(methodClean)
{Logger::WriteMessage("Method Cleanup\n");}
TEST_METHOD(test1)
{Logger::WriteMessage("Test 1\n");}
TEST_METHOD(test2)
{Logger::WriteMessage("Test 2\n"); }
};
}
Kolejność wywołań poszczególnych metod w przykładzie:
Module Initialize
Class Initialize
Method Initialize
Test 1
Method Cleanup
Method Initialize
Test 2
Method Cleanup
Class Cleanup
Module Cleanup
Do umieszczania komentarzy służy:
Logger::WriteMessage(const char*
message)
Komentarze te, po wykonaniu testów, znajdują się
w oknie Output po wybraniu w polu Show
Output from opcji Tests.
Przykładem, który będziemy testować jest klasa (Kalkulator) zawierająca
cztery funkcje: dodawanie, odejmowanie, mnożenie i dzielenie:
int Kalkulator::dodawanie(int x, int y)
{return(x + y);}
int Kalkulator::odejmowanie(int x, int y)
{return(x  y);}
int Kalkulator::mnozenie(int x, int y)
{return(x * y);}
double Kalkulator::dzielenie(int x, int y)
{ if(y != 0)
return(x / y);
else
Return 0; }
Metoda testująca funkcję dodającą wyglądać może następująco:
namespace UnitTest2
{
TEST_CLASS(UnitTest1)
{
TEST_METHOD(dod)
{
Kalkulator przyklad;
int NumberX = 5;
int NumberY = 3;
int expected = 8;
int actual;
actual = przyklad.dodawanie(NumberX, NumberY);
Assert::AreEqual(expected, actual);
}
};
}
Metodę tę można skrócić do:
namespace UnitTest2
{
TEST_CLASS(UnitTest1)
{
TEST_METHOD(dod)
{
Kalkulator przyklad;
Assert::AreEqual(8, przyklad.dodawanie(5, 3));
}
};
}
Jednak ta opcja jest mniej czytelna.
Do testowania używamy asercji:
AreEqual  sprawdza, czy dwa obiekty są równe. Metoda bada wartości
.
AreNotEqual  sprawdza, czy dwa obiekty są różne. Metoda bada wartości.
AreSame  sprawdza, czy przekazane wartości odnoszą się do tego samego
obiektu. Metoda bada referencje.
AreNotSame  sprawdza, czy przekazane wartości nie odnoszą się do tego
samego obiektu. Metoda bada referencje.
IsNull  sprawdza, czy dostarczona wartość to NULL
IsNotNull  sprawdza, czy dostarczona wartość jest inna niż NULL
IsTrue  sprawdza, czy dostarczona wartość lub wyrażenie jest prawdziwe
IsFalse  sprawdza, czy dostarczona wartość lub wyrażenie jest fałszywe
Fail  Wywołanie powoduje, że test jednostkowy jest niezaliczony
Szablony powyższych asercji znajdują się w załączonym pliku.


Wyszukiwarka

Podobne podstrony:
Laboratorium Testy jednostkowe
JUnit Pragmatyczne testy jednostkowe w Javie
informatyka w prawnicza testy
Historia państwa i prawa Polski Testy Tablice
156792 re ct discussion anonymous vs cartels
Sprawdziany i Testy Nauczycieli

więcej podobnych podstron