Який найкращий спосіб організувати наше тестування


18

Протягом багатьох років ми створили значну кількість одиничних тестів для нашої основної програми. Кілька тисяч. Проблема полягає в тому, що ми не маємо чіткого уявлення про те, які у нас тести, тому що їх так багато. І це проблема, оскільки ми не знаємо, де ми слабкі в тестах (або де у нас дублікати).

Наш додаток - це система звітування. Отже, ви можете мати шаблон, який використовується для тестування розбору (чи читаємо ми всі властивості таблиці), об'єднання даних (чи зберегли ми правильні властивості таблиці в об'єднанні), форматування підсумкової сторінки (чи правильно розміщена таблиця на сторінці ), та / або вихідний формат (чи правильно створений файл DOCX).

Додайте до цього те, що нам потрібно перевірити. Візьміть прокладки навколо комірки таблиці (для дизайну звіту використовуємо Word, Excel та PowerPoint). Ми повинні перевірити прокладку на розрив сторінки для таблиці всередині комірки, вертикально злитих комірок, горизонтально злитих комірок, вертикально & горизонтально об'єднаних комірок, що містить таблицю з вертикально & горизонтально об'єднаними клітинками у внутрішній таблиці, де ця таблиця перерви на сторінці.

То в яку категорію йде цей тест? Набивання таблиць, розбиття сторінок, вкладені клітинки, вертикально злиті клітини, горизонтальні всі об'єднані клітини чи щось інше?

І як ми документуємо ці категорії, називаємо одиничні тести тощо?

Оновлення: ряд людей запропонував використовувати інструменти покриття, щоб перевірити, чи є у нас повне покриття. На жаль, це обмежене використання в нашому випадку, оскільки помилки, як правило, обумовлені специфічними комбінаціями, тому код перевіряється всім, але не в цій комбінації.

Наприклад, учора у нас був клієнт, який запустив закладку Word наприкінці циклу forEach у своєму шаблоні (документ Word) і закінчив її на початку наступного циклу forEach. Це весь використаний код, який має одиничні тести проти нього, але ми не думали про комбінацію шаблону, який розширює закладку, починаючи починати 25 разів, потім закінчуючи 10 разів (дві петлі forEach мали різну кількість рядків).


1
Здається, ваше питання насправді: Як ми знаємо, що ми перевірили певний сценарій?
Енді Візендангер

Так! А також де тести на будь-які подібні сценарії. І від цього ми отримуємо потребу №2 - читання висвітленого тексту допомагає нам знайти те, що ми пропустили.
David Thielen

Відповіді:


13

Як правило, я схильний до дзеркала вихідного дерева для моїх тестових одиниць. Отже, якби у мене був src / lib / fubar, я мав би тест / lib / fubar, який би містив одиничні тести на фубар.

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


В даний час ми дзеркально відображаємо вихідне дерево. Але у нас є дві проблеми. По-перше, для форматування таблиці існує понад 100 різних тестів. Відстеження того, що саме тестується, стало проблемою. По-друге, дуже різні функціональні області потребують тестування таблиць - аналізатори, підміна даних, форматування та створення вихідного документа. Тож я думаю, що ти маєш рацію, в певному сенсі це функціональне тестування заданої властивості.
Девід Тілен

Що призводить до питання, де ми зберігаємо таблицю тестів? Я думаю про електронну таблицю в каталозі кореневих джерел ???
Девід Тілен

Я б зберігав його у контрольованій версії аркуша у тестовому каталозі. Якщо у вас є багато речей, які вам потрібно перевірити, зруйнування їх на метаструктури було б корисним. Спробуйте думати з точки зору того, яка загальна річ тестується замість того, що чи як.
Сардатріон

7

Найбільш поширеною структурою, здається, є дзеркало srcта testкаталог.

src/module/class
test/module/class_test

Однак, я бачив альтернативну структуру, яку я зараз вважаю кращою.

src/module/class
src/module/class_test

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


2
Одним недоліком колишнього підходу є те, що кожного разу, коли ви вирішите змінити структуру файлів проекту, ви повинні зробити те ж саме для структури тестів. Ця проблема не існує, якщо в тестах знаходиться код.
victor175

5

У .NET я схильний відображати або хоча б наближати структуру простору імен для вихідного коду в тестових проектах під основним простором імен "Tests.Unit" або "Tests.Integration". Усі тести блоку проходять в одному проекті, основна структура вихідного коду копіюється як папки в рамках проекту. Те саме для інтеграційних тестів. Отже, просте рішення для проекту може виглядати приблизно так:

Solution
   MyProduct.Project1 (Project)
      Folder1 (Folder)
         ClassAA (Class def)
         ...
      Folder2
         ClassAB
         ...
      ClassAC
      ...
   MyProduct.Project2
      Folder1
         ClassBA
         ...
      ClassBB
      ...
   ...
   MyProduct.Tests.Unit
      Project1
         Folder1
            ClassAATests
            ClassAATests2 (possibly a different fixture setup)
         Folder2
            ClassABTests
         ClassACTests
      Project2
         Folder1
            ClassBATests
         ClassBBTests
      ...
   MyProduct.Tests.Integration
      Project1 (a folder named similarly to the project)
         Folder1 (replicate the folders/namespaces for that project beneath)
            ClassAATests
         Folder2
            ClassABTests
         ClassACTests
      Project2
         Folder1
            ClassBATests
         ClassBBTests

Для будь-яких AAT або AEET, кодованих рамкою тестування одиниць, це трохи змінюється; Зазвичай ці тести відображають набір кроків, які перевірять функціональність нового випадку чи історії використання. Я зазвичай структурую ці тести в MyProduct.Tests.Acceptanceпроекті як такому, з тестами для кожної історії, можливо, згрупованою за етапом або "епічною" історією, до якої належить історія, що розробляється. Однак це справді просто тести на інтеграцію убер, тому, якщо ви віддаєте перевагу структурувати тести більш об'єктно-орієнтованими, а не орієнтованими на історію, вам навіть не потрібен MyProduct.Tests.Acceptanceподібний проект; просто киньте їх MyProduct.Tests.Integrationпід сферу випробуваного об'єкта вищого рівня.


3

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

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

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

Що стосується найменування, то особливих цінностей у витрачанні зусиль на назви одиничних тестів немає. Все, що ви хочете почути у своїх тестах, - це "5235 з 5235 пройдених тестів". Якщо тест не вдається, те, що ви читаєте, - це не його ім'я, а повідомлення , наприклад, Рядок у тому, assert()що реалізує ваш критерій успіху. Повідомлення повинно бути досить інформативним, щоб ви мали уявлення про те, що не так, не читаючи тестування. Ім’я неважливо порівняно з цим.


Погодьтеся 100% на все, що ви сказали (наша машина для складання виконує всі тести при реєстрації). Наша велика проблема - відстеження того, що ми тестуємо. І покриття коду не дуже допоможе (див. Оновлення вище).
Девід Тілен

1

Один із способів дізнатися, чи ти слабкий на тести, - це відстеження. Зазвичай для тестів це має форму висвітлення.

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

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