Як автоматично генеруються тести Guava-одиниць?


31

У Guava автоматично створюються одиниці тестових випадків :

У Guava є надзвичайна кількість одиничних тестів: станом на липень 2012 року, пакет guava-тестів включає понад 286 000 індивідуальних тестових випадків. Більшість з них генерується автоматично , не пишеться від руки, але тест покриття Guava надзвичайно ретельний, особливо для com.google.common.collect.

Як вони породжувалися? Які методи та технології використовувались для їх проектування та генерування?


Пам’ятаю, бачила розмову якогось чувака з Google, який торкнувся цієї теми. Немає жодного поняття про назву, однак, розмова була на якомусь конвенції Java, я думаю
Завірець

3
Пакет com.google.common.collect.testing має багато класів з "Генератором" у своїх назвах, що робить його схожим на основу для генерації тестів. Існують також підпакети з класами, задокументовані як "скелети" або "базові класи" для тестів ...
gnat

1
@gnat Так, я був впевнений, що десь бачив. com.google.common.collect.testing.features, наприклад, показує tfeatures / constrates, яким повинен задовольняти клас колекції, і тестовий випадок є їх комбінацією. Таким чином вони можуть параметризувати тестування
dzieciou


Питання привернуло багато уваги з боку громади, але поки що немає розумної відповіді, тому я дотримувався пропозиції Мартіна і викладав його тут: sqa.stackexchange.com/questions/5214/… .
dzieciou

Відповіді:


8

Значна частина цієї маси тестів призначена для реалізації колекції Guava. Вони написали загальні тести, які вичерпно перевіряють інтерфейси колекції, і це генерує набір на реалізацію. Дивіться, наприклад, класи , які називаються CollectionAddAllTester, ListIndexOfTester.

Це все підкріплене бібліотекою під назвою testlib, яка постачається у складі Гуави. Це досить загальне. Він підтримує написання загальних тестів для будь-якого інтерфейсу (не лише колекцій). Ви можете вказати Features можливих реалізацій та протестувати їх (наприклад, якщо ваш набір неможливо змінити, ви очікуєте іншого результату set.add()), а під час запуску тестів ви вкажете, які функції підтримує ваша реалізація.

Він заснований на JUnit 3, а не на 4. Як правило, у вас є клас, розширений TestCaseз методами, іменованими testSomething(), і JUnit запускає їх рефлекторно. Бібліотека testlib підключається до виконання цих тестів, щоб життєвий цикл виглядав так:

  • Для кожної реалізації, яку ви хочете протестувати
  • Для кожного (застосовного) методу випробувань
  • Створіть TestCaseпримірник
  • Ініціалізація TestSubjectGenerator- це інтерфейс testlib, який ви розширюєте там, де ви фактично створюєте тест
  • Рефлексивно запустити метод тесту. Під час цього методу getSubjectGenerator()надається доступ випробуваному

Ключовим бітом є додатковий етап ініціалізації, який дозволяє їм вводити конкретний суб'єкт тесту в загальний тестовий зразок.

Я написав пост про те, як написати тестові генерації наборів для власних інтерфейсів.

(Також розміщено з тим же запитом на сайті sqa .)


6

Є одиничні тестові генератори. Наприклад, у світі .NET щось подібне може зробити Microsoft Pex.

Наприклад, Microsoft Pex намагається на основі аналізу коду всіх можливих значень як аргументів методу. Очікується, що деякі аргументи дозволяють методу кинути виняток. Такі речі можуть автоматично тестуватися, створені для. Статичні значення, такі як порожня рядок, яка повертається в певних випадках, також можуть бути автоматично перевірені.


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

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