Зависимые тесты между двумя классами TestCase в PHPUnit - PullRequest
12 голосов
/ 12 января 2012

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

Я пытался:

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

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

Обновление:

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

Ответы [ 4 ]

13 голосов
/ 18 февраля 2013

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

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

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

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

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

- application\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.

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

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

6 голосов
/ 12 января 2012

Нет встроенного способа сделать это, но было бы нетрудно иметь какое-либо количество тестов, зависящих от некоторого другого прохождения теста. Вы должны убедиться, что 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);
    }
}

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

1 голос
/ 11 февраля 2019

Для тех, кто все еще задается вопросом об этом вопросе, вы можете использовать ссылку @Depends вместо @depends.Кажется, что строчная версия может использоваться только функциональным образом, тогда как заглавная может использоваться класс-класс.

/**
 * @Depends FirstTest::testMethodName
 */

Убедитесь, что зависимый тестовый класс будет запущен до фактического тестового класса , который зависит от него.Вы можете сделать это, объявив порядок тестовых классов в testsuite в phpunit.xml.

<phpunit
        bootstrap="./vendor/autoload.php"
        colors="true"
>
    <testsuites>
        <testsuite name="App\\Tests">
            <directory>./test</directory>
        </testsuite>
        <testsuite name="sample-testsuite">
         <directory>./test/FirstTest.php</directory>
         <directory>./test/SecondTest.php</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
</phpunit>

Затем запустите тестовый набор.1016 * Я проверял это только с 6.1.0 + версиями.Вы можете увидеть обсуждение этой проблемы здесь .Спасибо:)

0 голосов
/ 23 февраля 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...