Зависимые тесты между двумя классами TestCase в PHPUnit

В PHPUnit вы можете сделать один тест зависимым от другого теста, используя аннотацию @depends . Можно ли сделать целую TestCase зависимой от теста в другой TestCase? Или, по крайней мере, сделать один тест в одной тестовой камере, зависящей от теста в другой TestCase?

Я пытался:

 /** * @depends A::testMethodName */ 

Но, как я и ожидал, это не сработает.

Обновить:

Точная ситуация выглядит так: существует class B который использует class A Поэтому я хочу протестировать B только в том случае, если тесты для A (или одного из его тестов) выполняются без сбоя. Как я могу это сделать?

Solutions Collecting From Web of "Зависимые тесты между двумя классами TestCase в PHPUnit"

Эксплуатационные зависимости чрезвычайно важны! Свободная связь, о которой идет речь, относится к реальной архитектуре приложения, а не к единичным испытаниям. Если логические зависимости, встроенные в функциональное выполнение, всегда являются хорошей идеей для использования этих зависимостей.

Использование двойного дублирования подходит для SOA, где зависимости не могут быть сопоставлены с конкретным сбоем в черном ящике И служба ненадежна. Это не подходит для классов между приложениями.

Вы определенно хотели бы использовать этот тип функциональности, если есть логические зависимости между тестовыми классами. Концепция, которая будет понята при модульном тестировании, – это способность немедленно выявлять дефекты для отдельных компонентов.

Эта функция доступна на PHPUnit v 3.7.13. Однако единственный способ, которым это будет работать, – это запустить PHPUnit в каталоге, который содержит оба класса TestCase.

Например, с этой структурой папок

-приложение \ dep -BTest.php -CTest.php

Классы…

 class BTest extends PHPUnit_Framework_TestCase { /** * @depends CTest::testADomino */ public function testDominoDependent() { $this->assertTrue(true); } } 

а также…

 class CTest extends PHPUnit_Framework_TestCase { public function testADomino() { $this->assertTrue(false); } } 

Это результат

 C:\Users\Josh>C:\xampp\php\phpunit.bat "C:\xampp\htdocs\BeAgile\applications\sto cklogger\tests\dep" PHPUnit 3.7.13 by Sebastian Bergmann. SF Time: 0 seconds, Memory: 2.00Mb There was 1 failure: 1) CTest::testADomino Failed asserting that false is true. C:\xampp\htdocs\BeAgile\applications\stocklogger\tests\dep\CTest.php:7 FAILURES! Tests: 1, Assertions: 1, Failures: 1, Skipped: 1. 

Вы могли бы иметь оба класса тестового примера в одном файле, но это было бы плохой структурой. Нет необходимости «проверять», что один тест проходит перед другим.

В качестве гибкого тренера я вижу слишком частое удвоение теста в крупных организациях, где специализированные сегменты хотят избежать сбоев сборки, когда другие компоненты вносят изменения, которые приводят к сбою теста. Это, конечно же, поражает всю цель единичных тестов, которая заключается в выявлении сбоев компонентов до того, как это сделает конечный пользователь.

Нет никакого встроенного способа сделать это, но нетрудно было бы, чтобы любое количество тестов зависело от какой-либо другой передачи теста. Вы должны убедиться, что ATest выполняется до BTest .

 class ATest extends PHPUnit_Framework_TestCase { public static $passed = false; function testThatMustPass() { // ... the actual test ... // ok, test passed self::$passed = true; } } class BTest extends PHPUnit_Framework_TestCase { function testThatDependsOnA() { if (!ATest::$passed) { self::markTestSkipped('A failed'); } } } 

Также возможны тесты, зависящие от целого теста.

 class ATest extends PHPUnit_Framework_TestCase { public static $passed = true; protected function onNotSuccessfulTest(Exception $e) self::$passed = false; parent::onNotSuccessfulTest($e); } } 

Вы можете улучшить их, отслеживая имена неудачных тестов, чтобы вы могли зависеть от подмножества тестов для каждого случая.

Похоже, что ваши тесты являются интегративными, а не неудачными, если разные подмножества сломаны. Я бы посоветовал вам искать Моков и Отелей. Только те являются правильными ответами на ваш вопрос. Не поддавайтесь хакерским обходным решениям, которые могут причинить вам боль в долгосрочной перспективе.

http://phpunit.de/manual/3.6/en/test-doubles.html