-
-
Notifications
You must be signed in to change notification settings - Fork 282
/
testcase.texy
180 lines (138 loc) · 3.47 KB
/
testcase.texy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
TestCase
********
.[perex]
As afirmações podem seguir uma a uma em testes simples. Mas às vezes é útil incluir as afirmações para testar a classe e estruturá-las desta forma.
A classe deve ser descendente de `Tester\TestCase` e nós falamos sobre isso simplesmente como sobre **testcase***.
```php
use Tester\Assert;
class RectangleTest extends Tester\TestCase
{
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Run testing methods
(new RectangleTest)->run();
```
Podemos enriquecer um testcase pelos métodos `setUp()` e `tearDown()`. Eles são chamados antes/depois de cada método de teste:
```php
use Tester\Assert;
class NextTest extends Tester\TestCase
{
public function setUp()
{
# Preparation
}
public function tearDown()
{
# Clean-up
}
public function testOne()
{
Assert::same(/* ... */);
}
public function testTwo()
{
Assert::match(/* ... */);
}
}
# Run testing methods
(new NextTest)->run();
/*
Method Calls Order
------------------
setUp()
testOne()
tearDown()
setUp()
testTwo()
tearDown()
*/
```
Se o erro ocorrer em uma fase `setUp()` ou `tearDown()`, o teste falhará. Se ocorrer erro no método de teste, o método `tearDown()` é chamado de qualquer forma, mas com erros suprimidos nele.
Recomendamos que você escreva a anotação [@testCase |test-annotations#@testCase] no início do teste, então o executor do teste de linha de comando executará os métodos individuais do teste em processos separados e em paralelo em várias linhas. Isto pode acelerar significativamente todo o processo de teste.
/--php
<?php
/** @testCase */
\--
Anotação de métodos .[#toc-annotation-of-methods]
=================================================
Há algumas anotações disponíveis para nos ajudar com os métodos de teste. Nós as escrevemos para o método de teste.
@throws .[filter]
-----------------
É o mesmo uso de `Assert::exception()` dentro de um método de teste. Mas a notação é mais legível:
```php
/**
* @throws RuntimeException
*/
public function testOne()
{
// ...
}
/**
* @throws LogicException Ordem de argumento errada
*/
public function testTwo()
{
// ...
}
```
@dataProvider .[filter]
-----------------------
Esta anotação serve quando queremos executar o método de teste várias vezes, mas com argumentos diferentes. (Não confundir com a anotação do mesmo nome para [arquivos |test-annotations#dataProvider]).
Como argumento, escrevemos o nome do método que retorna parâmetros para o método de teste. O método deve retornar um array ou Traversable. Exemplo simples:
```php
public function getLoopArgs()
{
return [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
}
/**
* @dataProvider getLoopArgs
*/
public function testLoop($a, $b, $c)
{
// ...
}
```
A outra anotação **@dataProvider** aceita um caminho para o arquivo INI (relativamente ao arquivo de teste) como um argumento. O método é chamado tantas vezes quanto o número de seções contidas no arquivo INI. Arquivo `loop-args.ini`:
```ini
[one]
a=1
b=2
c=3
[two]
a=4
b=5
c=6
[three]
a=7
b=8
c=9
```
e o método que utiliza o arquivo INI:
```php
/**
* @dataProvider loop-args.ini
*/
public function testLoop($a, $b, $c)
{
// ...
}
```
Da mesma forma, podemos passar para um script PHP ao invés de INI. Ele deve retornar array ou Traversable. Arquivo `loop-args.php`:
```php
return [
['a' => 1, 'b' => 2, 'c' => 3],
['a' => 4, 'b' => 5, 'c' => 6],
['a' => 7, 'b' => 8, 'c' => 9],
];
```