Чи існують рамки тестування мовної агностичної одиниці? [зачинено]


11

Я завжди скептично ставився до переписування робочого коду - перенесення коду не є винятком із цього. Однак із появою TDD та автоматизованим тестуванням набагато розумніше переписати та рефакторний код.

Хтось знає, чи є інструмент TDD, який можна використовувати для перенесення старого коду? В ідеалі ви можете зробити наступне:

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

Альтернативою було б розділити крок 1 на "Записати одиничні тести мовою 1" та "Тести портових одиниць на мову 2", що значно збільшує необхідні зусилля і важко виправдати, якщо стара база коду перестане підтримуватися після порт (тобто ви не отримуєте переваги від постійної інтеграції на цій базі коду).

EDIT: Варто відзначити це питання на StackOverflow.


Надайте чистий текстовий протокол команд, а потім використовуйте expectдля реалізації ваших тестів.
SK-логіка

@ SK-логіка, про яку я не чув expect. Якщо у вас є застаріла система Unix, яка спілкується з трубами за допомогою stdin та stdout, тоді цей інструмент можна використовувати точно. Насправді, це було б досить легко перевірити з будь-якою мовою сценаріїв.
Bringer128

чому спадщина? Ви також можете мати сучасну систему в стилі Unix. У будь-якому разі, ніколи не існує дійсного обґрунтування того, що не надавати інтерфейс сценаріїв будь-якій частині функціоналу.
SK-логіка

@ SK-логіка Вибачте, що не зрозуміла. Я сказав , «спадок» , тому що портирование зазвичай робиться з legacy language xдо fancy new language y. Я не намагався нічого натякнути на Unix!
Bringer128

@ Bringer123, до речі, мій маленький трюк для здійснення подібної інтеграції, подібної до Unix, без будь-якої пристойної підтримки Unix (наприклад, немає належних труб) - вбудувати мову сценарію та забезпечити доступ до його REPL через порт TCP (з REPL працює в окремому потоці). Це і потужний інструмент налагодження, і двигун автоматизації тестів. І такий підхід працює з буквально всім (вбудована мова сценаріїв може бути справді крихітною, це може бути навіть четвертий сценарій з обмеженими ресурсами).
SK-логіка

Відповіді:


6

Я не думаю, що можна писати одиничні тести іншою мовою.

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

Якщо ваша програма є веб-службою, ви можете перевірити її будь-якою мовою, якщо вона підтримує ваш протокол. Якщо ваша програма працює в браузері, ви можете використовувати селен (це перше, що мені прийшло в голову, але є й інші. Інакше. Можливо, є деякі випадки, коли це не спрацює, я думаю, можливо, апаратні речі), все залежить щодо типу програми, над якою ви працюєте.

Звичайно, у вас не буде такого ж покриття, як у випробувань на рівні одиниць (якщо ви не витрачаєте багато часу), але принаймні, у вас буде тестовий джгут.


+1 для автоматизованих випробувань високого рівня. Це, безумовно, варто було б докласти зусиль.
Bringer128

1
"Я не думаю, що можна писати одиничні тести іншою мовою." : приклад лічильника: у .NET ви можете писати одиничні тести C # у Visual Basic (або будь-якій іншій мові з підтримкою .NET). Кілька років тому це навіть було сприйнято Microsoft як найкращу практику, оскільки вона знижує ризик внесення як коду, так і тестів однієї і тієї ж помилки, пов’язаної з мовою (а саме щодо відносного нерозуміння програміста). Погоджено, тестування PHP-коду у Fortran не записується одиничними тестами.
Арсеній Муренко

2

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

Можливо, те ж саме стосується мов CLI у .NET, наприклад, C #, F #, ASP.NET та ін.

Однак поза VM / CLR це складніше. Теоретично можна було б скласти одиничні тести та / або код, що перевіряється, на іншій мові, такі як C (як це було і є загальним для нових мов, таких як ранні C ++ тощо), але я не чув, щоб хтось спеціально намагався це перевірити одиничні тести.


1
Я думаю, це свідчить про проблему мого питання. Якщо вони можуть легко взаємодіяти, навіщо робити порт? А якщо вони не можуть, то мовний бар’єр унеможливлює тестування міжмовної одиниці.
Bringer128

@ Bringer128, прихильники нової породи мов JVM стверджують, що конкретні проблеми можна вирішити швидше, зі значно меншим та чистішим кодом, ніж у Java. Мій обмежений досвід роботи зі Скалою підтверджує це поки що.
Péter Török

Groovy також взаємодіє з Java.
користувач281377

1

Такого фреймворку не існує, оскільки він повинен бути написаний мовою використовуваного коду.

Наприклад, рамки для тестування коду c ++ потрібно писати в c або c ++. Використання фреймворку, написаного на c ++, можливо, але він не збирається перевіряти код змінного струму, якщо він використовує функції c ++.


1

Методології відрізняються, але в моєму випадку значна частина моїх тестів на TDD схильна до стилю "тесту на інтеграцію", на відміну від "одиничного тестування". Тобто, більшість із них перевіряють всю програму на запитах майже в реальному житті, перевіряючи відповідні відповіді.

У кількох випадках, коли я писав програми, керовані мережею (переважно протоколи, що стосуються додатків), у мене не було зручного тестового флексу, який був легким для роботи, тому я зробив більшу частину тестування "через мережу", в Коротше кажучи, я написав дуже простий клієнт іншою мовою із загальною та простою рамкою тесту, і більшість тестів перевіряли відповіді сервера.

І все-таки навіть у тих випадках я вводив декілька ручних тестів у реальну програму для тестування деяких немережевих деталей.


0

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


2
це, здається, не пропонує нічого суттєвого щодо питань, викладених та пояснених у попередніх 4 відповідях
gnat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.