@@ -46,6 +46,13 @@ const assertTabs = [
4646 { name: ' Exception.php' , slot: ' expectException' , icon: ' testo' },
4747 { name: ' Attributes.php' , slot: ' expectAttr' , icon: ' testo-class' },
4848]
49+
50+ const declareTabs = [
51+ { name: ' Класс' , slot: ' declare-class' , icon: ' testo-class' },
52+ { name: ' Функция' , slot: ' declare-function' , icon: ' testo-function' },
53+ { name: ' Конвенция' , slot: ' declare-convention' , icon: ' testo-class' },
54+ { name: ' Inline' , slot: ' declare-inline' , icon: ' class' },
55+ ]
4956</script >
5057
5158<div class =" home-feature " >
@@ -139,6 +146,108 @@ public function testInvalidInput(): void
139146</div >
140147</div >
141148
149+ <div class =" home-feature " >
150+
151+ ## Разные способы объявления тестов
152+
153+ <div class =" home-feature-row home-feature-row-reverse " >
154+ <div class =" home-feature-text " >
155+
156+ Пишите тесты так, как удобно вам.
157+
158+ - Тестами могут быть классы, функции или даже атрибуты прямо в продуктовом коде (Inline Tests).
159+ - Классам не нужно наследование от базового тестового класса. Код остаётся чистым.
160+ - Обнаружение тестов по соглашениям об именовании или по явным атрибутам.
161+
162+ </div >
163+ <div class =" home-feature-code " >
164+ <CodeTabs :tabs =" declareTabs " >
165+
166+ <template #declare-class>
167+
168+ ``` php
169+ // Явное объявление теста в методе с атрибутом #[Test]
170+
171+ final class OrderTest
172+ {
173+ #[Test]
174+ public function createsOrderWithItems(): void
175+ {
176+ $order = new Order();
177+ $order->addItem(new Product('Bread'));
178+
179+ Assert::int($order->itemCount())->equals(1);
180+ }
181+ }
182+ ```
183+
184+ </template >
185+
186+ <template #declare-function>
187+
188+ ``` php
189+ // Явное обозначение теста атрибутом #[Test]
190+ // или префиксом "test" в имени функции
191+
192+ #[Test]
193+ function validates_email_format(): void
194+ {
195+ $validator = new EmailValidator();
196+
197+ Assert::true($validator->isValid('user@example.com'));
198+ Assert::false($validator->isValid('invalid'));
199+ }
200+
201+ function testEmailValidator(): void { ... }
202+ ```
203+
204+ </template >
205+
206+ <template #declare-convention>
207+
208+ ``` php
209+ // Суффикс "Test" на классе и префикс "test" на методах
210+
211+ final class UserServiceTest
212+ {
213+ public function testCreatesUser(): void
214+ {
215+ $user = $this->service->create('john@example.com');
216+
217+ Assert::string($user->email)->contains('@');
218+ }
219+
220+ public function testDeletesUser(): void { /* ... */ }
221+ }
222+ ```
223+
224+ </template >
225+
226+ <template #declare-inline>
227+
228+ ``` php
229+ // Тестируем метод прямо в коде
230+ // Для простых случаев удобно
231+
232+ final class Calculator
233+ {
234+ #[TestInline([1, 1], 2)]
235+ #[TestInline([40, 2], 42)]
236+ #[TestInline([-5, 5], 0)]
237+ public function sum(int $a, int $b): int
238+ {
239+ return $a + $b;
240+ }
241+ }
242+ ```
243+
244+ </template >
245+
246+ </CodeTabs >
247+ </div >
248+ </div >
249+ </div >
250+
142251<div class =" sponsors-section " >
143252 <h2 class =" sponsors-title " >Спонсоры</h2 >
144253 <div class =" sponsors-grid " >
0 commit comments