Подтвердить что ты не робот

Является ли мой код действительно неспособным к тестированию?

Много кода в текущем проекте напрямую связано с отображением вещей с использованием стороннего 3D-рендеринга. Таким образом, легко сказать: "Это особый случай, вы не можете unit test его". Но я задаюсь вопросом, является ли это оправданным оправданием... легко думать "я особенный", но редко на самом деле.

Существуют ли типы кода, которые действительно не подходят для модульного тестирования? Подходящим, я имею в виду "без того, чтобы он занимал больше времени, чтобы выяснить, как написать тест, чем стоит усилий"... имея дело с тонкостью 3D-математики/рендеринга, может потребоваться много работы, чтобы доказать выход функции является правильным по сравнению с просто взглядом на визуализированную графику.

4b9b3361

Ответ 1

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

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

Например, может быть нетривиально проверить, что некоторая информация правильно анимирована в диалоговом окне, когда проверка не выполняется. Однако очень легко проверить, не завершится ли проверка для любого заданного ввода.

Обязательно структурируйте свой код так, чтобы "не проверяемая" площадь поверхности была хорошо отделена от теста и написала обширные тесты для кода без поверхности.

Ответ 2

Точка модульного тестирования вашего кода рендеринга не должна демонстрировать, что сторонний код делает правильную вещь (то есть для тестирования интеграции и регрессии). Дело в том, чтобы продемонстрировать, что ваш код дает правильные инструкции для стороннего кода. Другими словами, вам нужно только управлять вводом вашего уровня кода и проверять вывод (который станет входом средства визуализации).

Конечно, вы можете создать макетную версию рендеринга, которая делает дешевую графику ASCII или что-то в этом роде, а затем проверить псевдографику, если вы хотите, и это делает тест более четким, если вы хотите, но это не является абсолютно необходимым для a unit test вашего кода.

Ответ 3

Если вы не можете сломать свой код на единицы, это очень сложно для unit test. Я предполагаю, что если у вас есть трехмерные атомные функции (скажем, перевести, повернуть, и проецировать точку), они должны быть легко проверяемыми - создать набор контрольных точек и проверить, имеет ли трансформация точку в том месте, где она должна. Если вы можете достичь только трехмерного кода с помощью ограниченного API, тогда было бы трудно проверить. См. Сообщения о Misko Hevery Testability и его руководство по тестированию.

Ответ 4

Если вы можете захватить отображаемое изображение, вы можете unit test его.

Просто визуализируйте некоторые изображения с текущей кодовой базой, посмотрите, смотрят ли они "правильно" (исследуя их до пикселя, если вам нужно) и сохраняйте их для сравнения. Затем ваши тестовые тесты могут сравниться с этими сохраненными изображениями и посмотреть, будет ли результат одинаковым.

Независимо от того, стоит ли вам это делать, что вам решать.

Ответ 5

Разбейте рендеринг на шаги и протестируйте, сравнив буфер кадров для каждого шага с известными хорошими изображениями.

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

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

Ответ 6

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

То, что я считаю понятным с точки зрения блока, - это код, который, очевидно, имеет место для того, чтобы быть неправильным. Примеры:

  • Код для вычисления функций волосистой математики или линейной алгебры. Я всегда пишу вспомогательную функцию для проверки ответов и запускаю ее раз в то время.

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

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

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

Ответ 7

Ну вы не можете unit test определенные типы кода исключения, кроме этого...

У меня есть настоящие модульные тесты для некоторого кода, который кажется невозможным даже прикрепить тестовую проводку и код, который выглядит так, как будто он должен быть тестируемым, но это не так.

Один из способов узнать, что ваш код не является тестируемым, - это когда он зависит от физических характеристик устройства, на котором он работает. Другой тип кода, не подлежащего тестированию, - это прямой код пользовательского интерфейса (и я нахожу много разрывов в прямом UI-коде).

У меня также есть огромный кусок кода, не подлежащего тестированию, который имеет соответствующие тесты интеграции.