Задать вопрос

Как рассмотреть все возможные сочетания во времени случайных событий?

Какие используют диаграммы или может иные методики для описания логики во времени, чтобы не упустить ни одного возможного сочетания событий?

В линейной логике if-else – дерево вариантов, все ветки очевидны. Несложные асинхронные процессы описывал UML-диаграммой. Всё неплохо, пока нет ветвления. Но заметно усложняется диаграмма с появлением новых условий, и есть риск упустить какой-то из сценариев.

Выдуманный пример: три независимых источника событий A, B и C. Каждый рандомно выпускает события то редко, то может вдруг кучно.

Механизм X должен запускаться по первому событию А, если до этого не было запусков в течение N секунд, или не было ещё K событий A. В то же время 10 событий B в окне M секунд отменяют все запуски механизма X на следующие L секунд. Однако группа из (5 событий C, паузы S секунд и ещё 5 событий C) даёт зелёный свет на запуск X безо всяких ограничений в течение P секунд. (Не стал усложнять пример кросс-взаимодействиями всех трех).

Как можно наглядно изобразить диаграмму такой логики, и как быть уверенным, что тесты исчерпывающе проверяют работу?
  • Вопрос задан
  • 69 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@WhoMe
Если я правильно понял пример, то он выглядит довольно линейно.
Если предположить что X запускается только по событиям А, то логику можно оформить псевдокодом.
На_Событие_А() {
    if "5 событий C, паузы S секунд и ещё 5 событий C" было меньше P секунда назад {
        X();
    } else if 10 событий B в окне M секунд отменяют было меньше L секунд нада {
        // не запускаем X
    } if (Последний запуск Х был позже 5 сек) или (не было ещё K событий A) {
        Х();
    }
}


Графически можно попробовать представить в виде систем переходов.
680bae0d736a5965525484.png

Где состояния:
x_idle - Х не запущен
x_running - X работает
x_cooldown - N секунд с запуска X не прошло
not_yet_K_A - K событий A еще не было
K_A_occured - K событий A было
L_cooldown_ON - отмена всех запусков механизма X на следующие L секунд активна
...
ну и т.д.


Событиями будут, например:
A
B
C
Запуск X
Прошло N секунд с запуска X
K событий A
10 событий B в окне M секунд
Прошло L секунд с момента 10 событий B в окне M секунд
5 событий C, паузы S секунд и ещё 5 событий C
Прошло P секунд (с момента 5 событий C, паузы S секунд и ещё 5 событий C)

Соответственно, все возможные сочетания это произведение всех состояний всех систем помноженное на события.

Т.е берем первую комбинацию
x_idle, not_yet_K_A, l_cooldown_OFF, green_light_off и проверяем как система реагиурет на каждое событие.
Это не законченная схема, просто направление мысли.

Для исчерпывающих тестов также можно попробовать какой-нибудь автоматический верификатор вроде NuSMV, Alloy.
Ответ написан
Комментировать
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Пишете простой скрипт, в котором описываете все ваши условия и который на выходе выдаст все возможные связи и зависимости событий и элементов в виде какого-то формата. Ну и далее создаёте граф/диаграмму в виде картинки любой тулзой - например, через тот же UML или какой-нибудь mermaid.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы