Существуют ли какие-либо рамки модульного тестирования, не зависящие от языка? [закрыто]

11

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

Кто-нибудь знает, есть ли инструмент TDD, который можно использовать для портирования старого кода? В идеале вы могли бы сделать следующее:

  1. Запишите независимые от языка модульные тесты для старого кода, который проходит (или не проходит, если вы обнаружите ошибки!).
  2. Запустите модульные тесты на другой базе кода, которые не пройдут.
  3. Напишите код на вашем новом языке, который проходит тесты, не глядя на старый код.

Альтернативой может быть разделение шага 1 на «Записать модульные тесты на языке 1» и «Переносить модульные тесты на язык 2», что значительно увеличивает требуемые усилия и трудно обосновать, если старая кодовая база перестанет поддерживаться после порт (то есть вы не получаете преимуществ от непрерывной интеграции на этой базе кода).

РЕДАКТИРОВАТЬ: Стоит отметить этот вопрос на StackOverflow.

Bringer128
источник
Предоставьте чистый текстовый командный протокол, а затем используйте его expectдля реализации ваших тестов.
SK-logic
@ SK-логика, о которой я не слышал expect. Если у вас есть устаревшая система в стиле Unix, которая взаимодействует с каналами с использованием stdin и stdout, тогда этот инструмент можно использовать наверняка. На самом деле, было бы довольно легко протестировать и на любом языке сценариев.
Bringer128
почему наследие? У вас может быть и современная система в стиле Unix. В любом случае, никогда не существует обоснованного оправдания отказа от предоставления сценариев интерфейса для какой-либо части функциональности.
SK-logic
@ SK-logic Извините, что не ясно. Я сказал , «наследство» , потому что портирование обычно делается из legacy language xк fancy new language y. Я не пытался что-либо подразумевать в Unix!
Bringer128
@ Bringer123, кстати, мой маленький трюк для выполнения такого рода Unix-подобной интеграции без какой-либо достойной поддержки Unix (например, без надлежащих каналов) состоит в том, чтобы встроить язык сценариев и предоставить доступ к его REPL через порт TCP (с помощью REPL работает в отдельном потоке). Это мощный инструмент отладки и автоматизации тестирования. И этот подход работает буквально со всем (встроенный язык сценариев может быть очень маленьким, он может даже быть Forth в сценарии ограниченных ресурсов).
SK-logic

Ответы:

6

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

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

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

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

Дэвид
источник
+1 за автоматизированные тесты высокого уровня. Это определенно стоило бы усилий, чтобы произвести.
Bringer128
1
«Я не думаю, что можно написать модульные тесты на другом языке». : counter example: в .NET вы можете написать модульные тесты C # в Visual Basic (или любом другом языке с поддержкой .NET). Несколько лет назад Microsoft даже продвигала это как лучшую практику, поскольку она снижает риск внесения в код и тестирования одинаковых ошибок, связанных с языком (и, в частности, относительного неправильного понимания программистом его). Согласитесь, нельзя писать модульные тесты на Фортране для проверки кода PHP.
Арсений Мурзенко
2

Я думаю, что ближе всего к вашей идее являются рамки модульного тестирования в экосистемах на основе виртуальных машин, таких как Java VM. По крайней мере, Scala (и я считаю, что Groovy тоже - я не совсем уверен в Clojure) почти идеально совместим с Java. То есть код Scala можно тестировать с помощью JUnit, а код Java - с помощью ScalaTest. Таким образом, вы можете (постепенно или сразу) переписать код Java в Scala и продолжать использовать те же самые старые модульные тесты Java, чтобы проверить его правильность. (Или наоборот - хотя я не могу представить себе вескую причину для перехода с Scala обратно на Java.)

Вероятно, то же самое относится к языкам в .NET CLI, например, C #, F #, ASP.NET et al.

Вне VM / CLR, однако, это сложнее. Теоретически можно скомпилировать модульные тесты и / или тестируемый код на другом языке, таком как C (как это было и является обычным для новых языков, таких как ранний C ++ и т. Д.), Но я не слышал, чтобы кто-нибудь специально пытался это сделать с модульные тесты.

Петер Тёрёк
источник
1
Я предполагаю, что это показывает проблему с моим вопросом. Если они могут легко взаимодействовать, зачем порт? А если они не могут, то языковой барьер делает невозможным проведение кросс-языковых модульных тестов.
Bringer128
@ Bringer128, сторонники нового поколения языков JVM утверждают, что конкретные проблемы могут быть решены быстрее, с использованием значительно меньшего количества и более чистого кода, чем в Java. Мой ограниченный опыт работы со Scala подтверждает это.
Петер Тёрёк
Groovy так же хорошо взаимодействует с Java.
user281377
1

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

Например, инфраструктура для тестирования кода на c ++ должна быть написана на c или c ++. Использование фреймворка, написанного на c ++, возможно, но он не собирается тестировать код ac, если он использует функции c ++.

BЈовић
источник
1

Методологии меняются, но в моем случае большая часть моих тестов TDD имеет тенденцию к «интегральному тесту», в отличие от «модульного теста». То есть большинство из них тестируют всю программу в почти реальных запросах, проверяя соответствующие ответы.

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

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

Хавьер
источник
0

Фреймворк для независимого от языка теста - это универсальная тестовая среда, подходящая для приемочного теста (точка зрения), и тестовые случаи в этой среде управляются QA, например, Robotframework

rrsguru
источник
2
кажется, это не дает ничего существенного по сравнению с замечаниями, сделанными и объясненными в предыдущих 4 ответах
комнат