Ви не згадуєте свій інструмент для тестування. У багатьох є "комбінувати" функції, за допомогою яких можна зводити результати декількох циклів чи наборів. Якщо ви хочете отримати сукупний показник покриття, вивчіть функцію комбінування у вашому інструменті покриття.
Тепер ми можемо поговорити про слона в кімнаті?
Ложки немає. І немає "загального відсотка покриття". Принаймні, не простий.
Відсоток покриття - це легко зрозумілий показник, представлений для полегшення розуміння обсягу, глибини та діапазону тестових наборів. Але, як і будь-який простий орієнтир, дуже легко стати цільовим, закріпленим за цим значенням, як якийсь магічний талісман "повного тестування".
Скажімо, ви досягли слави "100% тестового покриття". Так! Але що це означає? 100% рядків коду перевірені, правда? Тоді як щодо цієї лінії?
launch_missile = launch_authorized and launch_cmd_given else previous_launch_status
"Покриття" цієї лінії означає щось - але не цілу партію, тому що існують різноманітні умови, які є True
або False
з певною вірогідністю, але навряд чи ви перевірили всі комбінації цих умов. Навіть якщо цей рядок охоплюється десяток разів, якщо одна з умов є відносно рідкісною, ви не наблизилися до тестування всіх реальних результатів, які можуть виникнути на практиці. Щоб зробити це більш зрозумілим, більш синтетичний приклад:
engage_laser = (laser_armed and safety_disengaged) or random.random() < 0.0000003
Скільки разів вам доведеться перекрити цю лінію, щоб справді вичерпно її перевірити? Скільки разів вам доведеться покривати його, щоб перевірити його в поєднанні з усіма іншими змінними в програмі (з власними, можливо подібними рідкісними) ймовірностями?
Я не кажу, що показники покриття марні. Вони насправді чудові . Вони зосереджуються на одному з ключових питань: Наскільки широко перевірена моя програмна система? Вони допомагають перейти від "у нас є кілька тестів" до "ми ретельно протестували".
Але поки ви працюєте над "комбінованими балами", реальність полягає в тому, що ваш результат, як правило, стосується "покриття звіту", а не покриття "умова", "предикат" або "шлях" . Тож незалежно від того, яке число дає ваші сукупні бали, малоймовірно, що воно дає вам справжнє уявлення про те, яка кількість потенційних станів вашої програми та комбінацій станів тестуються. Хоча ви працюєте над збільшенням відсоткового покриття, врахуйте також і вимірювання рівня покриття предикатами. Це дасть вам більш реалістичний - і майже незмінно більш тверезий - погляд на екстенсивність випробувань.