Отчеты о покрытии модели¶
Для оценки полноты тестирования формальной модели имеет смысл строить и изучать достигаемое тестовое покрытие.
Сбор покрытия¶
Чтобы включить сбор покрытия, нужно открыть Settings,
в разделе Anis > Coverage
найти настройку
Enabled
и установить галочку. После этого во время
тестирования будет собираться тестовое покрытие по
модели.
Если тесты запускаются повторно, нужно определить, что
делать с покрытием: дополнять или перезаписывать. Для
этого нужно открыть Settings и в разделе
Anis > Coverage
задать настройку Overwrite
.
Критерии покрытия модели¶
АНИС поддерживает следующие критерии покрытия формальной модели:
покрытие событий
покрытие отдельных охранных условий событий
покрытие элементов охранных условий событий
покрытие охранных условий внутри событий по MC/DC
покрытие элементов внутри отдельных охранных условий событий по MC/DC
Покрытие событий: оценивается, использовалось ли событие во время тестирования (по сути, использовалась ли системная операция, соответствующая событию). По каждому событию составляется количество использований. Оно детализируется на два количества: сколько раз охранное условие события целиком было истинным и сколько раз оно было ложным. Это позволяет оценить, каждая ли системная операция запускалась с успешным результатом и с неуспешным результатом.
Покрытие отдельных охранных условий событий: продолжает детализировать покрытие событий. Подсчитывается, сколько раз каждое охранное условие в отдельности было истинным и сколько раз оно было ложным. Это позволяет оценить, были ли проверены системные операции в разных случаях неуспешного результата.
Покрытие элементов отдельных охранных условий событий: позволяет еще больше детализировать покрытие событий. Охранное условие (как логическое выражение) разбивается на элементы (логические подвыражения) и подсчитывается, сколько раз каждый элемент встретился истинным и ложным. Следующие операции разбиваются для получения элементов:
конъюнкция;
дизъюнкция;
импликация.
Покрытие охранных условий внутри событий по MC/DC добавляет в покрытие охранных условий учет независимого влияния каждого отдельного охранного условия на результат охранного условия события целиком. Для этого строятся все векторы MC/DC для конъюнкции отдельных охранных условий каждого события и подсчитывается количество раз, когда реализовался каждый вектор.
Например, если у события E
3 охранных условия G1
, G2
, G3
,
то для покрытия по MC/DC достаточно 4-х векторов. Они приведены
в следующей таблице:
№ |
|
|
|
|
---|---|---|---|---|
1 |
True |
True |
True |
True |
2 |
False |
True |
True |
False |
3 |
True |
False |
True |
False |
4 |
True |
True |
False |
False |
Каждая строка представляет отдельный вектор. На пересечении строки и столбца показано, какое значение должно принимать отдельное охранное условие в этом векторе.
Покрытие элементов внутри отдельных охранных условий событий по MC/DC аналогично предыдущему критерию покрытия с той лишь разницей, что охранное условие рассматривается как формула (конъюнкция, дизъюнкция, импликация) и ее подформулы становятся элементами для составления векторов MC/DC. Отличие от классического MC/DC в том, что элементы могут содержать логические операции, т.е. при составлении списка элементов учитывается только одна (верхняя) логическая операция в формуле охранного условия.
Генерация отчета о покрытии модели¶
Чтобы сгенерировать отчет о покрытии модели, нужно воспользоваться задачей (Task). Изначально ее нет и ее нужно создать. После этого ее можно вызывать много раз без пересоздания.
Чтобы создать задачу, нужно:
вызвать команду
Tasks: Configure Task
, выбрать пункт о создании tasks.json из шаблона, выбрать Others в качестве шаблонав открывшемся редакторе файла
tasks.json
надо описать задачу следующим образом:
{
"version": "2.0.0",
"tasks": [
{
"label": "Generate Model Coverage Report",
"type": "process",
"command": "${command:python.interpreterPath}",
"args": ["-m", "anis.vscode.report"]
}
]
}
Чтобы сгенерировать отчет, нужно вызвать команду
Tasks: Run Task
и указать задачу генерации отчета.
На вопрос об анализе результатов задачи можно
ответить вариантом по умолчанию. Откроется терминал,
где будет напечатан вывод команды и, в частности,
ошибки.
Чтобы просмотреть отчет, нужно открыть файл
anis/coverage/index.html
. Удобнее это делать
извне VSCode. Для открытия внутри VSCode нужно
установить расширение Live Share и открыть им файл
отчета.
Состав отчета о покрытии модели¶
Отчет о покрытии состоит из следующих таблиц:
покрытие событий
покрытие отдельных охранных условий событий
покрытие элементов охранных условий событий
покрытие охранных условий внутри событий по MC/DC
покрытие элементов внутри отдельных охранных условий событий по MC/DC
Таблица про покрытие событий содержит следующие столбцы:
«Событие»: название события
«Успехов»: сколько раз его охранное условие (целиком) было истинным
«Неуспехов»: сколько раз его охранное условие (целиком) было ложным
Таблица одна, одна строка соответствует одному событию модели.
Таблица про покрытие отдельных охранных условий событий содержит следующие столбцы:
«Гард»: название отдельного охранного условия события
«Успехов»: сколько раз это охранное условие было истинным
«Неуспехов»: сколько раз это охранное условие было ложным
Таблица составляется для каждого события отдельно, каждая строка соответствует отдельныму охранному условию события.
Таблица про покрытие элементов охранных условий событий содержит следующие столбцы:
«Номер»: порядковый номер элемента в отдельном охранном условии события
«Успехов»: сколько раз этот элемент был истинным
«Неуспехов»: сколько раз этот элемент был ложным
Таблица составляется для каждого отдельного охранного условия, каждая строка соответствует своему элементу охранного условия.
Таблица про покрытие охранных условий внутри событий по MC/DC содержит столбцы для каждого отдельного охранного условия и столбец для количества. Каждой строке соответствует свой вектор MC/DC.
Таблица про покрытие элементов внутри отдельных охранных условий событий по MC/DC содержит столбцы для каждого элемента охранного условия и столбец для количества. Каждой строке соответствует свой вектор MC/DC.
Удаление несущественных элементов из отчета¶
Не все части отчета о покрытии могут быть покрыты целиком. Для этого есть несколько причин:
в модели есть служебные события, не соответствующие системным операциям; поэтому нет смысла оценивать их покрытие;
не все охранные условия события могут принимать оба логических значения; типичными примерами могут быть охранные условия о типах параметров событий, эти охранные условия всегда будут истинными, и еще охранные условия, истинность которых обеспечивается выбором соответствующих модельных сущностей в медиаторе;
аналогичные доводы можно применить и к элементам отдельных охранных условий.
Эти наблюдения приводят к необходимости не показывать такие части отчета о покрытии, которые заведома не будут покрыты целиком. АНИС позволяет описать эти части и учитывать их при построении покрытия.
Для их описания надо открыть Settings и в нем раздел
про Anis > Coverage > Report > Ignore Items
.
Раздел содержит несколько настроек. Большая часть из
них редактируется в файле settings.json
в формате JSON, ссылка
на открытие редактора размещена вместо области для
задания значения настройки. Для упрощения ввода
настройки в файле смотрите на подсказки и учитывайте
следующее их описание:
Const Events — список событий, чьи охранные условия (целиком) не могут принимать оба логических значения (истина и ложь). Эта настройка вводится как перечисление названий событий и по каждому единственное значение (логическое) и текст с причиной этого факта. Причина будет включена в отчет и подвергнута особому анализу.
Пример:
{
"anis.coverage.report.ignoreItems.constEvents": {
"event1": {
"value": true,
"reason": "Является проверкой типа параметра p"
}
}
}
Const Guards — список отдельных охранных условий (сгруппированный по событиям), которые могут принимать только одно из логических значений. Пример:
{
"anis.coverage.report.ignoreItems.constGuards": {
"event1": {
"guard1": {
"value": true,
"reason": "Является проверкой типа параметра p"
}
}
}
}
Const Conditions — аналогично предыдущим настройкам, но для элементов охранных условий. Охранное условие задается порядковым номером в формуле, начиная с 0. Пример:
{
"anis.coverage.report.ignoreItems.constConditions": {
"event1": {
"guard1": {
"2": {
"value": true,
"reason": "Является проверкой типа параметра p"
}
}
}
}
}
Exclude Events Entirely — список имен событий, которые целиком не показываются в отчете (применяется для служебных событий, не соответствующих системным операциям). Этот список имен можно задать непосредственно на странице Settings.
Exclude Events Mcdc Vectors — список MC/DC векторов для
покрытия конъюнкции отдельных охранных условий в одном событии.
Вектор задается в виде строки из символов T и F в порядке
упоминания охранных условий в событии. Этот порядок можно
проверить, открыв модуль события в пакете anis.model.events
.
Атрибут value
означает, должен ли этот вектор встречаться
(true значит должен встречаться, false — не должен).
Пример:
{
"anis.coverage.report.ignoreItems.excludeEventsMcdcVectors": {
"event1": {
"TTFT": {
"value": true,
"reason": "Является проверкой типа параметра p"
}
}
}
}
Exclude Guards Mcdc Vectors — аналогичная настройка, но векторы сгруппированы сначала по событиям, а внутри событий по отдельным охранным условиям. Пример:
{
"anis.coverage.report.ignoreItems.excludeGuardsMcdcVectors": {
"event1": {
"guard1": {
"TTFT": {
"value": true,
"reason": "Является проверкой типа параметра p"
}
}
}
}
}