pátek 24. dubna 2009

Unit testy v C++

V rámci přípravy na cvičení jsem vytvořil malinké makro, které může být základem unittestu (tedy testu správné funkčnosti již napsaného kódu). Cílem je mít možnost rychle ověřit, zda napsaný kód funguje alespoň na správně vybrané množině příkladů.

Využil jsem možnosti preprocesoru přepsat zadaný výraz na řetězcový literál, stačí před parametr makra napsat znak #. Chci vypisovat pouze testy, které selhaly, jelikož testů může být mnoho a není důvod se soustředit na ty, které dopadly dobře. Tudíž kód makra obsahuje podmínku.
Pro jednoduchost zpracování předpokládám, že veškeré navrácené objekty lze uložit do výstupního proudu operátorem <<. Tato podmínka není až tolik omezující, neboť platí pro všechny základní typy. Poslední řádek makra se stará o vymazání obsahu pomocného proudu.

Makro
#include <iostream>
#include <string>
#include "dict.h"

using namespace std;

#define TEST(expr, result) \
os << expr; \
if (os.str() != string(result)) { \
cout << "File " << __FILE__ << ", line " << __LINE__ << endl; \
cout << ">>> " << #expr << endl << os.str() << endl; \
cout << "ERROR (expected " << result << ")" << endl << endl; \
} \
os.str("");
Použití
int main()
{
Dict<string, int> d;
ostringstream os;
d.add("pes", 1);
TEST( d.contains("pes"), "1");
TEST( d.contains("les"), "1");
return 0;
}
Výstup při chybě
File test_dict.cpp, line 25
>>> d.contains("les")
0
ERROR (expected 1)

Žádné komentáře:

Okomentovat