05/2015 / Milan "perún" Herda / @moriquend / hrad.perunhq.org
Cieľom je otestovať fungovanie jednej jednotky kódu
Jednotka sa testuje izolovane od iných jednotiek kódu.
Jednotkou môže byť trieda alebo funkcia.
Testovanie jednotlivých modulov ako skupiny.
Jednotky sa už netestujú izolovane, ale v spolupráci s blízkymi objektami.
Testujeme rozhrania a spoluprácu medzi modulmi.
Integračný test môže siahať do kontrolovanej databázy, alebo na kontrolované API.
Rozšírené integračné testovanie, ktorého cieľom je otestovať najmä rozhrania medzi komponentami systému
Dáta prechádzajú od jedného rozhrania k druhému a medzitým sú kontrolované na platnosť.
Testuje sa functionalita kompletného systému.
Testovací scenár už zahŕňa komplexnejší proces (napr. prihlásenie, následná editácia záznamu a odhlásenie).
Sledujú sa aj prípadné vedľajšie efekty.
class Article
{
private $isRead = false;
public function markAsRead(User $user)
{
$this->isRead = true;
$user->addToReadArticles($article); // <-- toto nepatrí testovanej jednotke
}
}
Ako otestovať metódu markAsRead bez toho, aby sa vykonal kód patriaci triede User?
Namiesto inštancie skutočnej triedy User podsunieme volaniu markAsRead inštanciu potomka triedy User.
Táto inštancia na volanie addToReadArticles nebude reagovať alebo bude reagovať kontrolovaným spôsobom.
Nebudeme ich rozlišovať a obom budeme vravieť mock.
// PHPUnit
public function testMarkingAsRead()
{
$user = $this->getMock('User')
$article = new Article();
$article->markAsRead($user);
$this->assertTrue($article->isRead());
}
Namockovaný objekt prekryje volania všetkých metód a zabezpečí, že sa ich kód nezavolá. Defaultne budú vracať null.
// PHPUnit
public function testMarkingAsRead()
{
$user = $this->getMock('User')
$user->method('addToReadArticles')
->willReturn('foo');
$article = new Article();
$article->markAsRead($user);
$this->assertTrue($article->isRead());
}
// PHPUnit
public function testMarkingAsRead()
{
$user = $this->getMockBuilder('User')
->disableOriginalConstructor()
->getMock();
$user->method('addToReadArticles')
->willReturn('foo');
$article = new Article();
$article->markAsRead($user);
$this->assertTrue($article->isRead());
}
// PHPUnit
public function testMarkingAsRead()
{
$user = $this->getMockBuilder('User')
->disableOriginalConstructor()
->getMock();
$user->method('addToReadArticles')
->will$this->returnValueMap([
['param1', 'retval1'],
['paramN', 'retvalN'],
]);
$article = new Article();
$article->markAsRead($user);
$this->assertTrue($article->isRead());
}
// PHPUnit
public function testMarkingAsRead()
{
$article = new Article();
$user = $this->getMockBuilder('User')
->disableOriginalConstructor()
->getMock();
$user->method('addToReadArticles')
->with(
$this->equalTo(5),
$this->anything(),
$this->identicalTo($article)
)
->willReturn('foo');
$article->markAsRead($user);
$this->assertTrue($article->isRead());
}
// PHPUnit
public function testMarkingAsRead()
{
$article = new Article();
$user = $this->getMockBuilder('User')
->disableOriginalConstructor()
->getMock();
$user->expects($this->once())
->method('addToReadArticles')
->willReturn('foo');
$article->markAsRead($user);
$this->assertTrue($article->isRead());
}