Paper Review: Intramorphic Testing
Test Engineering NotesЗ одного боку, зараз я маю дуже мало вільного часу щоб читати великі технічні книги. З іншого - в мене накопичилася величезна купа цікавих дослідницьких робіт, які я хотів би прочитати. Роботи різні - від тестування до блокчейну та великих розподілених систем. До того ж, найгарячіші та найцікавіші речі швидше з'вляються у формі дослідницьких робіт, ніж у формі великих книжкових фоліантів.
Тому дозвольте представити Вам цикл дописів, де я буду ділитися основними тезами з дослідницьких робіт. Щось на кшталт блогу Morning Paper. Сподіваюся, такі дописи також буде цікаво читати поміж звичних статей про інструменти чи підходи.
Сьогодні до уваги підписників я пропоную роботу Manuel Rigger та Zhendong Su під назвою Intramorphic Testing A New Approach to the Test Oracle Problem.
Про test oracles та способи їх тестування
Test oracle - це механізм перевірки правильності output програми для набору вхідних даних. В ідеалі ці оракли повинні бути у формі вимог. Але не завжди усі вимоги відповідають тому коду, який реально написано. Тому дуже часто використовують "часткові тестові оракли" у формі регресійних тестів (автоматичних чи мануальних).
На даний момент декілька способів вирішення проблем часткових тестових ораклів, такі як differential testing та metamorphic testing. Обидва з них можна віднести до black-box методів тестування.
Автори у своїй роботі пропонують новий підхід - під назвою intramorphic testing.
У чому суть методів?
Differential testing

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

У цьому виді тестування ми використовуємо вхідне та вихідне значення системи для генерації нових вхідних значень. Наприклад для того ж алгоритму сортування, маючі вхідний масив [3,1,2] а вихідне значення [1,2,3] ми можемо модифікувати вхідне значення до [3,1] а перевірити, що вихідне значення також змінилося.
Intramorphic testing

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

Приклади
Але як щодо приктичних прикладів використання intramorphic testing?
У статті наводяться такі приклади:
- Infix, prefix, postfix формати відображення даних.
- Симуляція Монте-Карло. Інтраморфне тестування в цьому випадку дозволяє модифікувати вхідні дані (робити вибірки більше) задля того, щоб довести, що результати стали кращими.
- Knapsack problem. Тут greedy імплементацію алгоритму порівнюють з альтернативною імплементацію та зазначають, що вона повинна бути не менш точною, ніж перша.