Действительно ли возможно использовать TDD с алгоритмами обработки изображений?

ОБЪЯСНИТЕ Ваш друг. Кроме этого, необходимо полагаться на смесь специальных инструментов, тестирования и инструментов OS для наблюдения точно, что продолжается.

Много вещей видно эффективно или от инструментов OS (хороший для determing, является ли ситуацией ЦП или связанный IO), или различные переменные, которые видны в самом MySQL (покажите глобальные переменные, покажите механизм innodb состояние и т.д.).

я чувствую, что действительно важно иметь СРЕДУ ТЕСТА ПРОИЗВОДИТЕЛЬНОСТИ. Получите базу данных размера производства с подобной производству загрузкой (использующий моделирование загрузки) работающий на аппаратных средствах производственного класса в Вашей лаборатории (дорогой, но важный).

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

не делают определенных вещей, которые предлагают люди, если Вы не протестировали их в своей среде теста производительности и нашли, что они доказуемо выгодны.

По существу, производительность, настраивающаяся обычно, смотрит на три области в этом порядке:

  • Структура Вашей базы данных самой (структура таблицы, индексы и т.д.)
  • Запросы
  • Настройка параметров сервера

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

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

28
задан Cœur 5 September 2017 в 15:11
поделиться

8 ответов

Третий вариант звучит неплохо, но я согласен, что он не подходит для RESTfull ...

Вот еще одно предложение, которое может работать, а может и не работать: если вы храните историю версий вашего списка, вы можете запросить обновления, начиная с определенной версии. Это больше похоже на операцию GET. Идентификаторы версии могут быть либо простыми номерами версий (например, в svn), либо, если вы хотите поддерживать ветвление или другую нелинейную историю, они могут быть своего рода контрольными суммами (например, в монотонном).

Отказ от ответственности: I ' Я ни в коем случае не являюсь экспертом по философии или реализации REST.

Edit: Вы объявили, что PS после того, как я загрузил вопрос? Или я просто не прочитал ваш вопрос до конца, прежде чем написать ответ? Сожалею. Я все же думаю, что управление версиями может быть хорошей идеей.

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

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

4
ответ дан 28 November 2019 в 03:23
поделиться

Когда я занимаюсь разработкой, связанной с компьютерным зрением, TDD - это почти стандартная практика. У вас есть изображения и что-то, что вы хотите измерить. Шаг первый - вручную пометить (большое) подмножество изображений. Это дает вам тестовые данные. Затем процесс (для полной корректности) состоит в том, чтобы разделить ваш набор тестов на две части: «набор для разработки» и «набор для проверки». Вы повторяете циклы разработки до тех пор, пока ваш алгоритм не станет достаточно точным в применении к набору разработки. Затем вы проверяете результат на наборе для верификации (чтобы не перетренироваться по каким-то странным аспектам вашего набора для разработки. Это чистейшая разработка, управляемая тестированием.

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

  1. Регулярные ошибки, которые вы будете получать в своем программном обеспечении. Их можно протестировать с использованием "обычных" методов TDD.
  2. Производительность вашего алгоритма, для которой вам нужна система, описанная выше.

Программа может быть свободна от ошибок согласно (1), но не совсем согласно (2) . Например, очень простой алгоритм сегментации изображения гласит: «Левая половина изображения - это один сегмент, правая половина - это другой сегмент. Эту программу можно легко избавить от ошибок в соответствии с (1). Другое дело, если он удовлетворяет ваши потребности в производительности. Не путайте эти два аспекта и не позволяйте одному мешать другому.

В частности, я ' Я посоветую вам сначала разработать алгоритм, с ошибками и всем остальным, а затем использовать TDD с алгоритмом (а не кодом!) и, возможно, другими требованиями программного обеспечения в качестве спецификации для отдельного процесса TDDevelopment. Выполнение модульных тестов для небольших временных вспомогательных функций в рамках некоторого достаточно сложного алгоритма, находящегося в стадии интенсивной разработки, является пустой тратой времени и усилий.

9
ответ дан 28 November 2019 в 03:23
поделиться

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

Для реального алгоритма, такого как сегментация изображений, TDD не имеет большого смысла IMHO. Я даже не думаю, что здесь есть смысл юнит-тесты. Конечно, вы можете писать тесты, но они всегда будут очень хрупкими. Типичный алгоритм обработки изображений требует нескольких параметров, которые необходимо настроить для достижения желаемых результатов (процесс, который нельзя автоматизировать и который не может быть выполнен до того, как алгоритм заработает). Результаты алгоритма сегментации также не определены четко, но ваш модульный тест может проверять только какое-то четко определенное свойство. Алгоритм может иметь это свойство, не делая того, что вы хотите, или наоборот, поэтому результат вашего теста не очень информативен. Кроме того, чтобы проверить результаты алгоритма сегментации, вам нужно написать много довольно сложного кода, в то время как визуальная проверка результатов довольно проста , и вам все равно придется это делать .

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

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

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

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

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

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

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

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

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

в то время как визуальная проверка результатов довольно проста , и вы все равно должны это делать .

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

в то время как визуальная проверка результатов довольно проста , и вы все равно должны это делать .

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

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

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

5
ответ дан 28 November 2019 в 03:23
поделиться

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

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

10
ответ дан 28 November 2019 в 03:23
поделиться

Я бы сказал, что TDD намного проще в таком приложении, чем в веб-приложении. У вас есть полностью детерминированный алгоритм, который нужно протестировать. Вам не нужно беспокоиться о нечетких вещах, таких как ввод пользователя и рендеринг HTML.

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

4
ответ дан 28 November 2019 в 03:23
поделиться

Я не особо разбираюсь в вашей проблеме, поэтому не знаю ее горячих точек. Однако, мы надеемся, что окончательный результат вашего алгоритма будет детерминированным, поэтому вы можете выполнить его функциональное тестирование. Конечно, вам нужно будет определить «заведомо хороший» результат. Я знаю, что TDD выполняется на графических библиотеках (точнее, VTK). Сравнение выполняется на изображении окончательного результата, пиксель за пикселем. Не вдаваясь в такие подробности, если у вас есть заведомо хороший результат, вы можете выполнить md5 результата теста и сравнить его с md5 заведомо хорошего.

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

2
ответ дан 28 November 2019 в 03:23
поделиться

TDD в обработке изображений имеет смысл только для детерминированных задач, таких как:

  • арифметика изображения
  • генерация гистограммы
  • и так далее ..

Однако TDD не подходит для алгоритмов выделения признаков, таких как:

  • обнаружение краев
  • сегментация
  • обнаружение углов

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

5
ответ дан 28 November 2019 в 03:23
поделиться

Возможно, вы захотите взглянуть на этот документ

1
ответ дан 28 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: