2009-09-25 2 views
2

This answer поразил меня тем, что я никогда не понимал с тем, как вы обрабатываете типы параметров в динамических языках по сравнению с статическим языком (моя перспектива информируется или деформируется - как вам угодно) из Java.Как вы эффективно тестируете параметры динамических языков?

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

Но в какой-то момент что-то вне устройства вызовет этот метод. Скажем, это тяжелый вес, который будет издеваться над любыми модульными тестами классов, которые его используют. Теперь у вас много классов, которые называют этот метод, и вам нужно изменить тип. Чтобы это было просто, оно использовало номер, но теперь требует буквенного числа, и вам нужно использовать метод, специально доступный по строке, а не на числовом объекте с новым требованием.

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

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

ответ

2

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

+0

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

+0

Не судите статическую типизацию Java. Его система типа достаточно мощна, чтобы раздражать вас, но недостаточно мощна, чтобы помочь вам. Вы должны хотя бы проверить OCaml. – Chuck

2

Мне нужно 15 символов для публикации, но ответ длится четыре символа: grep.

+0

+1. Статические и динамические - все о компромиссах. Вы получаете кое-что, вы должны отпустить некоторые вещи. Одним из них является простой рефакторинг. Однако, я не думаю, что ответ длится 4 символа. Это просто в наши дни. :) – muhuk

1

Это, скорее всего, вопрос рефакторинга, чем вопрос о единичном тестировании.

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

1

Короткий ответ - это всего лишь «больше тестов на единицу измерения».

Единственное, что имеет значение, это то, что новый тип также имеет необходимые методы. Поэтому, если ClassA имеет Method1(), который принимает параметр obj и вызывает obj#M1() и obj#M2() - единственным ограничением на obj является то, что он отвечает на эти сообщения. Если вы измените реализацию, чтобы вызвать метод Foo(), который раньше не существовал, тесты, выполняющие класс A, терпят неудачу.

Далее, если ClassB вызывает A#Method1() как часть его функциональности, его тесты потерпят неудачу, если класс B передает объект obj, который имеет необходимые методы. Если требуемое поведение B не будет достигнуто, его тесты не сработают, и это должно привести к изменениям, необходимым для B.

+0

Спасибо, но именно поэтому я объяснил случай тяжелого объекта - скажем, тот, который делает доступ к базе данных, что вам нужно было бы издеваться над разумным модульным тестом. – Yishai

+0

ok .. так что вы вопросы, так как у нас нет строго типизированных интерфейсов в динамических языках, как мы гарантируем, что реальный объект поддерживает один и тот же набор сообщений? Я бы сказал, что у вас есть приемочные тесты, в которых используется настоящий соавтор, а не в вашем тестовом наборе, который выполняется каждый раз ... но тот, который выполняется ежедневно. – Gishu

+0

Я не думаю, что класс сцепления - хорошее решение. Даже если он упростит тестирование, он сделает код более спасительным. – muhuk

2
  1. Код в обороне. Сделайте изменение обратно совместимым в новом методе. Отправка по типу аргумента; CLOS делает это легко.

  2. Используйте функцию «кто звонит» вашего редактора или IDE.

1

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

Есть ошибки находя инструменты для:

Для PHP, phc можно сделать это с очень небольшим количеством работы.

В целом, если у вас нет статического ввода текста, вам нужен инструмент для получения преимуществ.

Смежные вопросы