Testy jednostkowe z dataProvider

0

Witam, Czy moze ktos mi podaj jakis sensowny przyklad z uzycien dataProvider? Mam jakas tam klase do przetestowania, ktora zaleznie od tego co dostanie raz wyrzucic tablice z 1 a raz z 3 albo i wiecej elementami. Jak testujecie cos takiego?

Przyklad

public function additionProvider(): array
    {
        return [
            [[[1212312, 'type', 300.00, 10, 3]], [['itemId' => 87654, 'amount' => 10], ['itemId' => 87655, 'amount' => 20], ['itemId' => 87656, 'amount' => 30]]],
            [[[1212313, 'type', 300.00, 9.99, 1]], [['itemId' => 92342, 'amount' => 9.99]]],
        ];
    }

    /**
     * @dataProvider additionProvider
     */
    public function testMyClass($data, array $expected): void
    {
        $myClass = new myClass();
        $myClass->doWork($data);

        
        $this->assertSame($myClass->getAdminFees()[0]->itemId, $expected[0]['itemId']);
        $this->assertSame($myClass->getAdminFees()[0]->amount, $expected[0]['amount']);
        
        $this->assertSame($myClass->getAdminFees()[1]->itemId, $expected[1]['itemId']);
        $this->assertSame($myClass->getAdminFees()[1]->amount, $expected[1]['amount']);
        
        $this->assertSame($myClass->getAdminFees()[2]->itemId, $expected[2]['itemId']);
        $this->assertSame($myClass->getAdminFees()[2]->amount, $expected[2]['amount']);
    }
0

Druga sprawa to generator yield w data provieder. Nie rozumiem, po co jest uzywany?

1

Tutaj (chociaż nie podałeś przykładu) yield tworzy generator. Po użyciu tego słówka, zawiesza wykonywanie funkcji i zwraca wartość do wywołującego, a po kolejnym odwołaniu się do niej kontynuuje wykonywanie i zwraca kolejną wartość.
Gdybyś go nie użył funkcja zwracałby to samo za każdym razem, a tak ma możliwość zwracania kolejnych casów testowych.

dataProvider to zwyczajnie, przypadki testowe umieszczone w jednym miejscu.
Czyli zamiast rozbijać przypadki w kodzie (co jest mało czytelne), to masz to wszystko w providerze.

//Edit
Dla kompletu kod z yieldem

<?php
function prov(){
    $a = [
        'my first test case',
        'my second test case',
        'my third test case',
        'hurray! my last test case'
    ];
    foreach($a as $item){
        yield $item;
    }
}

foreach(prov() as $i){
    echo $i . "\n";
}

echo "\nAnother conception call\n";

$gen = prov();
echo $gen->current() . "\n";
$gen->next();

echo $gen->current() . "\n";
$gen->next();

echo $gen->current() . "\n";
1

Jeśli mówisz o PhpUnit (bo tak domyślam się z tematu), to data provider to jest sposób na sparametryzowanie przypadku testowego.

Tutaj mamy przykład testu zwykłego

public function test1() { 
  $this->assertSame("FOO", strToUpper("foo")); 
}

public function test2() { 
  $this->assertSame("FOO", strToUpper("fOo")); 
}

public function test3() { 
  $this->assertSame("FOO", strToUpper("FOO")); 
}

Tutaj mamy to samo tylko z data providerem

/**
 * @dataProvider cases
 */
public function test(string $value) {
  $this->assertSame("FOO", strToUpper($value));
}

public function cases() {
  return [
    ['foo'],
    ['fOo'],
    ['FOO'],
  ];
}

Używamy tego kiedy testy są bardzo podobne do siebie, i chcemy jakoś wyrazić w kodzie, że Twoje przypadki testowe tak na prawdę testują ten sam feature, tylko z innymi danymi wejściowymi.

poniatowski napisał(a):

Druga sprawa to generator yield w data provieder. Nie rozumiem, po co jest uzywany?

Generator w PHP (i innych językach) to obiekt, który sekwencyjnie dostarcza kolejnych wartości (podobnie jak iterator), tylko że generatora nie można cofać.

W PhpUnit dataProviderem, może być albo funkcja która zwraca array, albo Iterator albo Iterable, lub też to może być generator. A żeby zrobić generator, można użyć notacji funkcji z yield, np tak:

/**
 * @dataProvider cases
 */
public function test(string $value) {
  $this->assertSame("FOO", strToUpper($value));
}

public function cases() {
  yield 'foo';
  yield 'fOo';
  yield 'FOO';
}

A po co jest używany, po nic specjalnego, większość data providerów to jednak array. Generatory są wspierane w data providerach, bo chyba nie było żadnego powodu żeby nie były wspierane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1