Тестирование переходов конечных автоматов, реализованных в виде карты - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть конечный автомат с относительно небольшим набором состояний и входов, и я хочу тщательно проверить переходы.
Переходы кодируются с использованием Map<State, Map<Input, State>>, код выглядит примерно так:

enum State {
    S1,
    // ...
}

enum Input {
    I1,
    // ...
}

class StateMachine {
    State current;

    Map<State, Map<Input, State>> transitions = {
        S1: {
            I1: S2,
            // ...
        },
        // ...
    };

    State changeState(Input x) {
        if (transitions[current] == null)
            throw Error('Unknows state ${current}');
        if (transitions[current][x] == null)
            throw Error('Unknown transition from state ${current} with input ${x}');

        current = transitions[current][x];
        return current;
    }

    void execute() {
        // ...
    }
}

Чтобы проверить это, я вижу 3 подхода:
1) Напишите партию стандартного кода для проверки каждой комбинации
2) Автоматизация создания тестов: мне кажется, это лучший подход, но в конечном итоге это будет использовать структуру, идентичную Map, используемой в StateMachine. Что я должен делать? Скопировать карту в тестовый файл или импортировать ее из файла реализации? Последнее делает тестовый файл зависимым от реализации и не выглядит хорошей идеей.
3) Проверить карту на равенство, та же проблема, что и раньше: равенство с самим собой или с копией? Этот подход по сути то, что я делаю с другими 2, но не похоже на канонический тест

1 Ответ

0 голосов
/ 19 сентября 2018

Может быть, вы хотите взглянуть на это: https://www.itemis.com/en/yakindu/state-machine/documentation/user-guide/sctunit_test-driven_statechart_development_with_sctunit

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...