Корзина (0)---------

Корзина

Ваша корзина пуста

Корзина (0)---------

Корзина

Ваша корзина пуста

Каталог товаров
Наши фото
2
3
1
4
5
6
7
8
9
10
11
информационная модель в виде ER-диаграммы в нотации Чена
Информационная модель в виде описания логической модели базы данных
Информациооная модель в виде описания движения потоков информации и документов (стандарт МФПУ)
Информациооная модель в виде описания движения потоков информации и документов (стандарт МФПУ)2
G
Twitter
FB
VK
lv

ВКР ФИТ НГУ Исследование методов генерации тестовых сценариев по EDTL-требованиям в целях динамической верификации poST-программ

Генерация тестовых сценариев по EDTL-требованиям для динамической верификации poST-программ | Заказать ВКР ФИТ НГУ | Diplom-it.ru

Автоматическая генерация тестовых сценариев для верификации process-ориентированных программ


Актуальность автоматической генерации тестов для формальной верификации управляющего ПО

Студенты ФИТ НГУ, работающие над темами верификации программного обеспечения, сталкиваются с проблемой ручного создания тестовых сценариев для проверки соответствия poST-программ формальным требованиям. Разработка транслятора, автоматически генерирующего тестовые последовательности из EDTL-спецификаций, требует интеграции знаний в области темпоральной логики, тестирования и процесс-ориентированного программирования.

Особую сложность представляет преобразование высокоуровневых темпоральных требований в конкретные последовательности входных векторов, способные выявить нарушения спецификаций в poST-программах. Многие студенты недооценивают объем работ по созданию системы трансформации EDTL-конструкций в исполняемые тестовые сценарии и их интеграции со средами выполнения IndustrialC. В этой статье мы представим комплексный подход к разработке такого транслятора с практическими примерами.

Срочная помощь по вашей теме: Получите консультацию за 10 минут! Telegram: @Diplomit Телефон/WhatsApp: +7 (987) 915-99-32, Email: admin@diplom-it.ru

Оформите заказ онлайн: Заказать ВКР ФИТ НГУ

Архитектура системы генерации тестовых сценариев

Многоуровневая система преобразования требований в тесты

Эффективный транслятор тестовых сценариев должен включать следующие компоненты:

  • Анализатор EDTL-требований — разбор и интерпретация темпоральных спецификаций
  • Генератор путей выполнения — построение возможных сценариев для каждого требования
  • Синтезатор тестовых векторов — создание конкретных входных последовательностей
  • Адаптер для poST-среды — преобразование в исполняемые тесты для IndustrialC
  • Система исполнения тестов — запуск и мониторинг выполнения сценариев
  • Анализатор результатов — проверка соответствия ожидаемому поведению

Методы трансформации EDTL-требований в тестовые сценарии

Алгоритмы генерации для различных паттернов требований

Паттерн EDTL Метод генерации Генерируемые сценарии
Trigger-Response Генерация триггерного события и проверка ответа Последовательности с временными ограничениями
Prevention Создание условий для предотвращаемого события Сценарии проверки блокировки нежелательных событий
Persistence Генерация длительных условий состояния Тесты на устойчивость состояния во времени
State Condition Создание переходов между состояниями Последовательности изменения состояний
// Генератор тестовых сценариев на Java
public class TestScenarioGenerator {
    private final EDTLSpecification specification;
    private final TestGenerationStrategy strategy;
    public TestScenarioGenerator(EDTLSpecification spec) {
        this.specification = spec;
        this.strategy = new CoverageOptimizedStrategy();
    }
    public List<TestScenario> generateTestScenarios() {
        List<TestScenario> allScenarios = new ArrayList<>();
        for (EDTLRequirement requirement : specification.getRequirements()) {
            List<TestScenario> requirementScenarios = 
                generateScenariosForRequirement(requirement);
            allScenarios.addAll(requirementScenarios);
        }
        // Оптимизация набора сценариев
        return strategy.optimizeTestSet(allScenarios);
    }
    private List<TestScenario> generateScenariosForRequirement(
            EDTLRequirement requirement) {
        switch (requirement.getPatternType()) {
            case TRIGGER_RESPONSE:
                return generateTriggerResponseScenarios(requirement);
            case PREVENTION:
                return generatePreventionScenarios(requirement);
            case PERSISTENCE:
                return generatePersistenceScenarios(requirement);
            case STATE_CONDITION:
                return generateStateConditionScenarios(requirement);
            default:
                return Collections.emptyList();
        }
    }
    private List<TestScenario> generateTriggerResponseScenarios(
            EDTLRequirement requirement) {
        TriggerResponsePattern pattern = (TriggerResponsePattern) requirement.getPattern();
        List<TestScenario> scenarios = new ArrayList<>();
        // Сценарий корректного выполнения
        TestScenario positiveScenario = new TestScenario(
            requirement.getName() + "_positive");
        // Генерация начального состояния
        State initial = generateInitialState(requirement);
        positiveScenario.addStep(initial);
        // Генерация триггерного события
        Event trigger = generateTriggerEvent(pattern.getTrigger());
        positiveScenario.addStep(trigger);
        // Проверка ответа в течение таймаута
        TimeoutCondition timeout = pattern.getTimeout();
        List<Event> responseChecks = generateResponseChecks(
            pattern.getResponse(), timeout);
        positiveScenario.addAllSteps(responseChecks);
        scenarios.add(positiveScenario);
        // Сценарий нарушения таймаута (если применимо)
        if (timeout != null) {
            TestScenario timeoutScenario = generateTimeoutScenario(requirement, pattern);
            scenarios.add(timeoutScenario);
        }
        return scenarios;
    }
    private TestScenario generateTimeoutScenario(EDTLRequirement requirement, 
                                                TriggerResponsePattern pattern) {
        TestScenario scenario = new TestScenario(
            requirement.getName() + "_timeout_violation");
        // Создание условий, при которых ответ не поступает вовремя
        State blockingState = generateBlockingState(pattern.getResponse());
        scenario.addStep(blockingState);
        Event trigger = generateTriggerEvent(pattern.getTrigger());
        scenario.addStep(trigger);
        // Ожидание превышения таймаута
        TimeoutCondition timeout = pattern.getTimeout();
        TimeoutEvent timeoutEvent = new TimeoutEvent(timeout.getValue());
        scenario.addStep(timeoutEvent);
        // Проверка отсутствия ожидаемого ответа
        MissingResponseCheck missingCheck = 
            new MissingResponseCheck(pattern.getResponse());
        scenario.addStep(missingCheck);
        return scenario;
    }
}
// Генератор конкретных тестовых векторов
public class TestVectorGenerator {
    public List<TestVector> generateVectors(TestScenario scenario) {
        List<TestVector> vectors = new ArrayList<>();
        int time = 0;
        for (TestStep step : scenario.getSteps()) {
            TestVector vector = generateVectorForStep(step, time);
            vectors.add(vector);
            // Учет временных характеристик шага
            time += step.getDuration();
        }
        return vectors;
    }
    private TestVector generateVectorForStep(TestStep step, int currentTime) {
        TestVector vector = new TestVector();
        vector.setTimestamp(currentTime);
        if (step instanceof State) {
            State state = (State) step;
            vector.setInputs(generateStateInputs(state));
            vector.setExpectedOutputs(generateStateOutputs(state));
        } else if (step instanceof Event) {
            Event event = (Event) step;
            vector.setInputs(generateEventInputs(event));
            vector.setExpectedOutputs(Collections.emptyMap());
        } else if (step instanceof Check) {
            Check check = (Check) step;
            vector.setInputs(Collections.emptyMap());
            vector.setExpectedOutputs(generateCheckOutputs(check));
        }
        return vector;
    }
    private Map<String, Object> generateStateInputs(State state) {
        Map<String, Object> inputs = new HashMap<>();
        for (StateCondition condition : state.getConditions()) {
            inputs.put(condition.getSignal(), condition.getValue());
        }
        return inputs;
    }
}

Интеграция с IndustrialC средой выполнения

Генерация исполняемого кода тестов для poST-программ

// Генератор тестов на IndustrialC для poST-программ
public class IndustrialCTestGenerator {
    public String generateTestSuite(List<TestScenario> scenarios, 
                                   PostProgram program) {
        StringBuilder code = new StringBuilder();
        code.append("// Автоматически сгенерированные тесты для верификации\n");
        code.append("#include \"post_runtime.h\"\n");
        code.append("#include \"test_framework.h\"\n\n");
        code.append("// Объявление тестовых функций\n");
        for (TestScenario scenario : scenarios) {
            code.append(String.format("void test_%s(void);\n", 
                scenario.getName().toLowerCase()));
        }
        code.append("\n// Основная функция тестирования\n");
        code.append("int main() {\n");
        code.append("    test_initialize();\n");
        for (TestScenario scenario : scenarios) {
            code.append(String.format("    test_%s();\n", 
                scenario.getName().toLowerCase()));
        }
        code.append("    test_summary();\n");
        code.append("    return 0;\n");
        code.append("}\n\n");
        // Генерация конкретных тестовых функций
        for (TestScenario scenario : scenarios) {
            code.append(generateTestFunction(scenario, program));
        }
        return code.toString();
    }
    private String generateTestFunction(TestScenario scenario, PostProgram program) {
        StringBuilder function = new StringBuilder();
        function.append(String.format("void test_%s(void) {\n", 
            scenario.getName().toLowerCase()));
        function.append("    TEST_BEGIN(\"").append(scenario.getName()).append("\");\n\n");
        // Генерация последовательности тестовых шагов
        int stepNumber = 0;
        for (TestVector vector : scenario.getVectors()) {
            function.append(generateTestStep(vector, stepNumber++));
        }
        function.append("    TEST_END();\n");
        function.append("}\n\n");
        return function.toString();
    }
    private String generateTestStep(TestVector vector, int stepNumber) {
        StringBuilder step = new StringBuilder();
        step.append(String.format("    // Шаг %d (t=%dms)\n", stepNumber, vector.getTimestamp()));
        // Установка входных сигналов
        for (Map.Entry<String, Object> input : vector.getInputs().entrySet()) {
            step.append(String.format("    set_input(\"%s\", %s);\n", 
                input.getKey(), formatValue(input.getValue())));
        }
        // Задержка до следующего шага (если нужно)
        if (stepNumber > 0) {
            step.append(String.format("    delay_ms(%d);\n", 
                vector.getTimestamp() - previousTimestamp));
        }
        // Проверка ожидаемых выходов
        for (Map.Entry<String, Object> output : vector.getExpectedOutputs().entrySet()) {
            step.append(String.format("    ASSERT_OUTPUT(\"%s\", %s, \"%s\");\n", 
                output.getKey(), formatValue(output.getValue()),
                "Проверка на шаге " + stepNumber));
        }
        step.append("\n");
        return step.toString();
    }
}
// Пример сгенерированного теста на IndustrialC
#include "post_runtime.h"
#include "test_framework.h"
// Объявление тестовых функций
void test_door_safety_positive(void);
void test_call_response_normal(void);
void test_call_response_timeout(void);
// Основная функция тестирования
int main() {
    test_initialize();
    test_door_safety_positive();
    test_call_response_normal(); 
    test_call_response_timeout();
    test_summary();
    return 0;
}
void test_door_safety_positive(void) {
    TEST_BEGIN("Door Safety Positive");
    // Шаг 0 (t=0ms)
    set_input("moving", false);
    set_input("doorOpen", false);
    delay_ms(100);
    ASSERT_OUTPUT("doorOpen", false, "Проверка на шаге 0");
    // Шаг 1 (t=100ms)
    set_input("moving", true);
    set_input("doorOpen", true);
    delay_ms(50);
    ASSERT_OUTPUT("doorOpen", false, "Двери должны остаться закрытыми при движении");
    TEST_END();
}
void test_call_response_normal(void) {
    TEST_BEGIN("Call Response Normal");
    // Шаг 0 (t=0ms)
    set_input("callButton", false);
    set_input("currentFloor", 1);
    delay_ms(100);
    // Шаг 1 (t=100ms)
    set_input("callButton", true);
    delay_ms(5000); // В пределах 30 секунд
    ASSERT_OUTPUT("currentFloor", 3, "Лифт должен приехать на вызванный этаж");
    TEST_END();
}

Динамическая верификация poST-программ

Система исполнения и мониторинга тестов

// Система динамической верификации poST-программ
public class DynamicVerificationEngine {
    private final TestExecutor executor;
    private final ResultAnalyzer analyzer;
    private final ReportGenerator reporter;
    public VerificationResult verifyProgram(PostProgram program, 
                                          List<TestScenario> scenarios) {
        VerificationResult overallResult = new VerificationResult();
        for (TestScenario scenario : scenarios) {
            TestResult scenarioResult = executeScenario(program, scenario);
            overallResult.addScenarioResult(scenario.getName(), scenarioResult);
        }
        return overallResult;
    }
    private TestResult executeScenario(PostProgram program, TestScenario scenario) {
        // Компиляция poST-программы в исполняемый код
        String executable = compilePostProgram(program);
        // Генерация тестового драйвера
        String testDriver = generateTestDriver(scenario, program);
        // Запуск теста
        ProcessResult processResult = executor.executeTest(executable, testDriver);
        // Анализ результатов
        return analyzer.analyzeExecution(processResult, scenario);
    }
}
// Анализатор результатов выполнения
public class TestResultAnalyzer {
    public TestResult analyzeExecution(ProcessResult processResult, 
                                      TestScenario scenario) {
        TestResult result = new TestResult(scenario.getName());
        // Анализ вывода программы
        analyzeOutput(processResult.getStdout(), result);
        // Анализ кода возврата
        analyzeExitCode(processResult.getExitCode(), result);
        // Анализ временных характеристик
        analyzeTiming(processResult.getExecutionTime(), scenario, result);
        return result;
    }
    private void analyzeOutput(String output, TestResult result) {
        // Парсинг вывода тестового фреймворка
        String[] lines = output.split("\n");
        for (String line : lines) {
            if (line.contains("ASSERT_FAIL")) {
                result.addFailure(parseAssertionFailure(line));
            } else if (line.contains("TEST_PASS")) {
                result.setStatus(TestStatus.PASSED);
            } else if (line.contains("TEST_FAIL")) {
                result.setStatus(TestStatus.FAILED);
            }
        }
    }
}
// Генератор отчетов о верификации
public class VerificationReportGenerator {
    public String generateHTMLReport(VerificationResult result) {
        StringBuilder html = new StringBuilder();
        html.append("""
            <!DOCTYPE html>
            <html>
            <head>
                <title>Отчет верификации poST-программы</title>
                <style>
                    .passed { background-color: #d4edda; }
                    .failed { background-color: #f8d7da; }
                    .table { border-collapse: collapse; width: 100%; }
                    .table th, .table td { border: 1px solid #ddd; padding: 8px; }
                </style>
            </head>
            <body>
                <h1>Отчет динамической верификации</h1>
                <div class=\"summary\">
                    <h2>Общая статистика</h2>
                    <p>Всего сценариев: %d</p>
                    <p>Успешно: %d</p>
                    <p>Неудачно: %d</p>
                </div>
                <table class=\"table\">
                    <thead>
                        <tr>
                            <th>Сценарий</th>
                            <th>Статус</th>
                            <th>Время выполнения</th>
                            <th>Ошибки</th>
                        </tr>
                    </thead>
                    <tbody>
            """.formatted(
                result.getTotalScenarios(),
                result.getPassedCount(),
                result.getFailedCount()
            ));
        for (Map.Entry<String, TestResult> entry : result.getScenarioResults().entrySet()) {
            TestResult testResult = entry.getValue();
            String rowClass = testResult.getStatus() == TestStatus.PASSED ? "passed" : "failed";
            html.append(String.format("""
                <tr class="%s">
                    <td>%s</td>
                    <td>%s</td>
                    <td>%d мс</td>
                    <td>%s</td>
                </tr>
                """, rowClass, entry.getKey(), testResult.getStatus(),
                testResult.getExecutionTime(), String.join(", ", testResult.getFailures())));
        }
        html.append("""
                    </tbody>
                </table>
            </body>
            </html>
            """);
        return html.toString();
    }
}

Почему 150+ студентов выбрали нас в 2025 году

  • Оформление по всем требованиям вашего вуза (мы изучаем 30+ методичек ежегодно)
  • Поддержка до защиты включена в стоимость
  • Доработки без ограничения сроков
  • Гарантия уникальности 90%+ по системе "Антиплагиат.ВУЗ"

Метрики качества тестовых сценариев

Критерии оценки эффективности генерации

Метрика 1: Покрытие требований

Методика оценки: Процент EDTL-требований, для которых сгенерирован хотя бы один тестовый сценарий

Метрика 2: Покрытие кода poST

Методика оценки: Процент выполняемых строк/ветвей poST-программы, активируемых тестовыми сценариями

Метрика 3: Эффективность выявления дефектов

Методика оценки: Количество реальных ошибок, обнаруженных автоматически сгенерированными тестами

Пример полного цикла верификации

От EDTL-требований до отчета о верификации

// Полный цикл генерации и выполнения тестов
public class CompleteVerificationWorkflow {
    public VerificationReport executeFullWorkflow(
            String edtlSpecPath, 
            String postProgramPath) {
        // 1. Загрузка EDTL-спецификации
        EDTLSpecification spec = loadEDTLSpecification(edtlSpecPath);
        // 2. Загрузка poST-программы
        PostProgram program = loadPostProgram(postProgramPath);
        // 3. Генерация тестовых сценариев
        TestScenarioGenerator scenarioGenerator = new TestScenarioGenerator(spec);
        List<TestScenario> scenarios = scenarioGenerator.generateTestScenarios();
        // 4. Генерация тестовых векторов
        TestVectorGenerator vectorGenerator = new TestVectorGenerator();
        for (TestScenario scenario : scenarios) {
            List<TestVector> vectors = vectorGenerator.generateVectors(scenario);
            scenario.setVectors(vectors);
        }
        // 5. Генерация кода тестов на IndustrialC
        IndustrialCTestGenerator testGenerator = new IndustrialCTestGenerator();
        String testCode = testGenerator.generateTestSuite(scenarios, program);
        // 6. Компиляция и выполнение тестов
        DynamicVerificationEngine verifier = new DynamicVerificationEngine();
        VerificationResult result = verifier.verifyProgram(program, scenarios);
        // 7. Генерация отчета
        VerificationReportGenerator reporter = new VerificationReportGenerator();
        String htmlReport = reporter.generateHTMLReport(result);
        return new VerificationReport(htmlReport, result);
    }
}
// Пример использования
public class VerificationExample {
    public static void main(String[] args) {
        CompleteVerificationWorkflow workflow = new CompleteVerificationWorkflow();
        VerificationReport report = workflow.executeFullWorkflow(
            "elevator_spec.edtl",
            "elevator_control.post"
        );
        // Сохранение отчета
        saveReport(report.getHtmlContent(), "verification_report.html");
        System.out.println("Верификация завершена. Отчет сохранен.");
        System.out.println("Успешных тестов: " + report.getResult().getPassedCount());
        System.out.println("Неудачных тестов: " + report.getResult().getFailedCount());
    }
}

Оптимизация набора тестовых сценариев

Методы сокращения избыточности и повышения эффективности

Для обеспечения эффективности процесса верификации необходима оптимизация тестовых сценариев:

  1. Минимизация дублирования — устранение избыточных сценариев с помощью анализа покрытия
  2. Приоритизация сценариев — упорядочивание по критичности проверяемых требований
  3. Параллельное выполнение — распределение тестов по независимым группам
  4. Инкрементальная верификация — выполнение только измененных тестов при модификации программы
  5. Адаптивное тестирование — динамическая корректировка сценариев на основе предыдущих результатов

Примеры оптимизированных наборов тестов можно изучить в нашем разделе выполненных работ.

Срочная помощь по вашей теме: Получите консультацию за 10 минут! Telegram: @Diplomit Телефон/WhatsApp: +7 (987) 915-99-32, Email: admin@diplom-it.ru

Оформите заказ онлайн: Заказать ВКР ФИТ НГУ

Заключение

Исследование методов генерации тестовых сценариев по EDTL-требованиям для динамической верификации poST-программ представляет собой комплексную задачу, требующую интеграции знаний в области формальных методов, тестирования программного обеспечения и процесс-ориентированного программирования. Разработанный транслятор позволяет автоматизировать процесс создания тестовых последовательностей, значительно повышая эффективность верификации управляющего ПО.

Если вы столкнулись со сложностями в реализации генератора тестовых сценариев, интеграции с IndustrialC средой или анализе результатов верификации — обратитесь к нашим специалистам. Мы обеспечим не только качественное выполнение работы, но и полное соответствие гарантиям и требованиям ФИТ НГУ.

Дополнительные материалы для изучения:

Наши услуги и гарантии:

Оцените стоимость дипломной работы, которую точно примут
Тема работы
Срок (примерно)
Файл (загрузить файл с требованиями)
Выберите файл
Допустимые расширения: jpg, jpeg, png, tiff, doc, docx, txt, rtf, pdf, xls, xlsx, zip, tar, bz2, gz, rar, jar
Максимальный размер одного файла: 5 MB
Имя
Телефон
Email
Предпочитаемый мессенджер для связи
Комментарий
Ссылка на страницу
0Избранное
товар в избранных
0Сравнение
товар в сравнении
0Просмотренные
0Корзина
товар в корзине
Мы используем файлы cookie, чтобы сайт был лучше для вас.