Які найкращі практики для тестування програм зі стохастичною поведінкою?


14

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

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

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

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

Чи існують встановлені найкращі практики тестування таких систем? Якщо так, деякі посилання були б дуже корисними. Якщо ні, будь-які інші пропозиції вітаються!


5
Ви також не можете знущатися над буфером кільця ядра? І інші випадкові аспекти вашого коду?
Джонатан Мерлет

1
@JonathanMerlet Потенційно, але проблема полягає в тому, що при розгортанні код матиме доступ до реального кільця буфера (справді, до реальної ОС). Тож якщо я тестую лише версію, що переглядається, то я просто відкладаю відкриття цих помилок на пізніше.
Джон Дучетт

Мені здається, що проблема пов'язана не з випадковою поведінкою програми (оскільки це може контролюватися випадковим початком), а з певними станами цього "буфера ядра кільця". Отже, ваше запитання насправді "як я перевірити програму, яка залежить від зовнішнього стану", правда?
AakashM

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

Відповіді:


7

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

Потім запустіть свої тести як з істинним випадковим введенням, так і в стилі регресії з будь-якими раніше виявленими цікавими випадками.

У конкретному випадку вашого доступу до ядра я рекомендую робити макет у будь-якому випадку. Використовуйте макет, щоб примусити класи еквівалентності, які рідше виявляються на практиці, у дусі "порожнього" та "повного" для контейнерів, або "0, 1, 2 ^ n, 2 ^ n + 1, багато" для обчислювальні речі. Тоді ви можете спробувати з глузду і з реальною справою, знаючи, що ви розглядали та перевіряли випадки, про які ви думали досі.

В основному, те, що я пропоную, становить сукупність детермінованих та недетермінованих даних, детерміновані - це сукупність тих, про кого ви можете придумати, і тих, кого ви здивували.


6

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


1
це; або знущатися з prng цілком
jk.

1
Дякую за пропозицію! Я вже роблю це для тестування одиниць, але не можу перевірити всі можливі програми від руки.
Джон Дучетт

2
але це означає, що ви не можете перевірити, чи працює випадковість правильно ..
Луї Різ

2

Я думаю, що статистичне тестування - єдиний спосіб. Так само, як випадкові числа "перевіряються" на випадковість статистичними тестами, так повинні бути алгоритми, що використовують випадкову поведінку.

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


Не обов’язково, тому що ви можете вибрати невеликий набір «вхідних» входів і виконати кілька разів на них - кількість входів, необхідних для встановлення надійності, може бути меншою. Цей "натягнутий" набір повинен входити в кожну гілку коду, ініціалізувати всі об'єкти тощо.
Данило Москович

2

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

Якщо ви не можете легко створити тестові класи, можна використовувати статистичний тест, як сказав #Euphoric. Borning та ін. порівняйте традиційний підхід та статистичний. Узагальненням статистичних тестів, запропонованих @Euphoric, може бути те, що обговорювалося Уіттакером. Він запропонував створити стохастичну модель бажаної (стохастичної у вашому випадку) поведінки, а потім генерувати конкретні тестові випадки з цієї моделі (див. Його присвячений документ ).


Спасибі! Виглядає дуже корисно. Для тих, хто знаходиться поза навчальними закладами, додруковану версію статті можна витягнути з авторського сховища коду google тут: team4model.googlecode.com/svn/trunk/resources/paper/…
Джон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.