Покрытие Flow
Команда coverage предоставляет метрику объёма проверок, выполненных Flow для каждой части вашего кода. Программа с высоким показателем покрытия Flow должна повысить вашу уверенность в том, что Flow обнаружил все потенциальные ошибки времени выполнения.
Определяющим фактором является наличие any в выведенном типе каждого выражения. Выражение, выведенный тип которого — any, считается непокрытым; в противном случае оно считается покрытым.
Чтобы понять, почему именно эта метрика выбрана для оценки эффективности Flow, рассмотрим пример
const one: any = 1; one();
Этот код приводит к ошибке типа во время выполнения, поскольку мы пытаемся вызвать число. Однако Flow не сообщает об ошибке, потому что мы аннотировали переменную one типом any. Проверка Flow фактически отключается при наличии any, поэтому вызов будет молча разрешён. Использование этого небезопасного типа снизило эффективность проверки типов. Метрика покрытия помогает это выявить, сообщая обо всех случаях one как о непокрытых.
Пространство проектирования
Какие типы следует считать «покрытыми»?
Описанный выше способ определения покрытия довольно грубый. Можно было бы представить критерий, согласно которому выражения помечаются как непокрытые, если какая-либо часть их типа включает any, например Array<any>. У подобной метрики есть свои преимущества, но обычно «непокрытая» часть типа остаётся непокрытой при выполнении различных операций со значениями этого типа. Например, в коде
declare const arr: Array<any>;
arr.forEach(x => {}); параметр x будет помечен как непокрытый. Кроме того, на практике такой строгий критерий создавал бы слишком много шума, а его вычисление на лету обходилось бы довольно дорого.
Объединённые типы
Исключение из этого принципа — объединённые типы: тип number | any считается непокрытым, хотя формально any не является конструктором верхнего уровня. Объединения лишь кодируют выбор из набора других типов. В этом смысле мы консервативно считаем выражение непокрытым, если хотя бы один из возможных типов этого выражения ограничивает возможности проверки. Например, в коде
let x: number | any = 1; x = "a";
Flow разрешит присвоить что угодно переменной x, что снижает уверенность в использовании x в качестве числа. Поэтому x считается непокрытым.
Пустой тип
С точки зрения покрытия интерес представляет тип empty. Этот тип приблизительно соответствует недостижимому коду. Поэтому проверка выражений типа empty выполняется менее строго, но на то есть веская причина: этот код не будет выполняться во время работы программы. Поскольку такой код часто удаляют, покрытие Flow также сообщает о коде, выведенный тип которого — empty, но отличает его от случая с any.
Использование командной строки
Чтобы узнать покрытие файла file.js со следующим содержимым
function add(one: any, two: any): number {
return one + two;
}
add(1, 2); выполните следующую команду
$ flow coverage file.js Covered: 50.00% (5 of 10 expressions)
Этот вывод означает, что для 5 из 10 узлов программы был выведен тип any. Чтобы точно увидеть, какие части не покрыты, можно также передать один из следующих флагов:
-
--color: Выведет файл file.js в терминале, выделив непокрытые места красным цветом. Например:flow coverage --color file.js -
--json: Выведет список всех диапазонов непокрытых мест с тегом"uncovered_locs". Например:flow coverage --json file.js
Наконец, рассмотрим следующий пример недостижимого кода:
function f(x: 'a' | 'b') {
if (x === 'a') {
// ...
} else if (x === 'b') {
// ...
} else {
x;
}
} До последней ветви else выполнение доходить не должно, поскольку мы уже проверили оба элемента объединения. Поэтому в этой ветви для x выводится тип empty.
В цветном выводе команды эти части отображаются синим цветом, а в JSON-выводе они находятся в поле "empty_locs".
Использование для нескольких файлов
Чтобы проверить покрытие нескольких файлов за один раз, воспользуйтесь командой batch-coverage:
$ flow batch-coverage dir/
Она выведет статистику покрытия для каждого файла в dir/, а также общие результаты.
Обратите внимание: для работы batch-coverage требуется активный сервер Flow, не работающий в ленивом режиме.
См. также
© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/cli/coverage