Очередной вопрос по тестированию: разделяемый юнит-тест

Рейтинг: 1Ответов: 0Опубликовано: 07.12.2014

Предположим, есть некий сложный интерфейс, который реализуют несколько классов с разной "подложкой", но внешне они должны работать абсолютно идентично (пример - строковые данные, в основе которых лежит некий stream), другими словами, тесты для них должны различаться только создаваемым инстансом (в чуть более сложной версии - тесты совпадают, скажем, на 90%). Как корректно написать разделяемый тест для нескольких классов? Наследование, кмк, плохая идея, возможно, надо просто вынести сами тесты в отдельный класс (как StepObject в веб-тесте), которые будут выглядеть как SharedTestClass::testDataRetrieval(StreamDataInterface $object), но тоже не очень нравится - сами тесты разделяются, но их вызов остается в основном классе, который все равно придется обновлять. Создавать тест-класс, который будет принимать в конструкторе FQCN класса совсем не вариант, потому что придется запускать его вручную, а это выдернет его из текущей инфраструктуры.

Обновление

Представим такую ситуацию

interface StreamBasedStringInterface {
    (static) public function substr((int) $start, (int) $length);
    (int) public function getSize();
}
class FileStreamString implements StreamBasedStringInterface { ... }
class MemoryStreamString implements StreamBasedStringInterface { ... }

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

Ответы

Ответов пока нет.