1. Тестовий фреймворк

Код містить модульні та інтеграційні тести, які можна виконувати автоматично, щоб переконатися, що програма працює як передбачено. Такі тести часто пишуть, щоб спровокувати появу помилки та переконатися, що її буде виявлено, якщо вона з’явиться знову в майбутньому, а також щоб перевірити поведінку компонентів та інтерфейсів.

Тести зібрані в каталозі tests/. Окремі тести знаходяться в підкаталогах цього каталогу. Тести згруповані в каталоги.

2. Виконання тестів

Тести виконуються скриптом scripts/runtests, який генерується з scripts/runtests.in під час компіляції. Скрипт runtests за замовчуванням шукає тести для виконання в каталозі tests/, але його можна обмежити виконанням лише певного набору тестів, вказавши каталог тесту або тестів як аргумент(и).

Приклад запуску лише тестів у tests/lathe/.
$ scripts/runtests tests/lathe/
Running test: tests/lathe
Runtest: 1 tests run, 1 successful, 0 failed + 0 expected, 0 skipped'

Скрипт runtests шукає всі файли з іменами test, test.sh або test.hal у каталогах, вказаних у командному рядку, або в каталозі tests/, якщо аргумент командного рядка не вказано. Ці файли представляють три різні способи виконання тестів.

Скрипт runtests приймає такі аргументи, дивіться вивід scripts/runtests -h для повноважного списку:

-n  не видаляти тимчасові файли для успішних тестів.
-s  зупиняти після будь-якого невдалого тесту.
-p  друкувати файли stderr та result.
-c  Видаляти тимчасові файли з попереднього запуску тесту.
-u  Виконувати тільки тести, які вимагають доступу звичайного користувача.
-v  Показувати stdout та stderr (зазвичай вони приховані).

3. Письмові тести

Переконайтеся, що тест може успішно виконуватися без робочого дисплея X11, тобто зі знятою змінною середовища DISPLAY.

  1. Створіть папку в tests/.

  2. Надайте один тестовий сценарій.

  3. Оцініть результат за допомогою одного з наведених нижче варіантів.

Ось файли, що розглядаються в каталозі з окремими тестами:

Тестовий скрипт (лише один із цих трьох)
тест

Програма, яка виконується, а її код виходу та вивід перевіряються за допомогою методу checkresult або expected.

test.sh

Bash-скрипт, який виконується, а його код виходу та вивід перевіряються за допомогою checkresult або expected.

test.hal

Скрипт HAL, який виконується за допомогою halrun -f test.hal, а його код виходу та вивід перевіряються за допомогою checkresult або expected.

Оцінювання тесту
очікуваний

Файл, вміст якого порівнюється з результатом виконання тестових скриптів. Якщо результат тесту ідентичний вмісту очікуваного файлу, тест проходить успішно.

перевіртерезультат

Виконуваний файл для виконання більш складної перевірки, ніж просто порівняння виводу тестового скрипта. Він отримує ім’я файлу тестової програми як аргумент командного рядка. Код завершення цієї програми контролює результат тесту. Якщо існують як expected, так і checkresult, для перевірки виводу тесту використовується тільки checkresult.

xfail

Якщо цей файл існує, очікується невдача тесту, і виконання тестів не повертатиме код виходу, що сигналізує про помилку.

пропустити

Якщо цей файл існує, тест пропускається і взагалі не виконується.

Контроль

Цей файл можна використовувати для позначення конкретних вимог у тесті. Наразі можна позначити використання sudo, і тести, що вимагають sudo, можна пропустити, використовуючи runtests -u. Щоб позначити такі вимоги, додайте до цього файлу рядок із Restrictions: sudo.

обов’язковий

Цей файл може містити список попередніх вимог з config.h (по одній на рядок). Якщо вони не виконуються, тест буде пропущено. Наприклад, якщо ваш тест залежить від того, що config.h має #define HAVE_TK_H 1 та #define HAVE_LIBMODBUS3 yes, додайте до цього файлу рядок з TK_H та рядок з LIBMODBUS3.

4. Деякі підходи до тестування

Існує кілька способів структурування тесту, залежно від того, що потрібно перевірити. Ось кілька ідей, як це зробити.

4.1. Неінтерактивний "GUI"

Якщо ви хочете протестувати деякі операції в інтерфейсі користувача, корисним підходом буде написання власного «GUI», що імітує ці операції. Це можна зробити, створивши звичайну конфігурацію LinuxCNC і вказавши значення [DISPLAY] DISPLAY на скрипт, який виконує операції, необхідні для тестування поведінки.

Приклади такого підходу можна знайти у tests/halui/jogging/ та tests/interp/subroutine-return/.

4.2. Запис переходів між виводами HAL

За допомогою компонентів HAL sampler та halsampler можна налаштувати конфігурацію HAL, зібрати налаштування та зміни значень виводів і вивести результат на stdout (або у файл). Кінцевий результат можна порівняти з очікуваним результатом, щоб перевірити, чи HAL працює як очікується.

Приклади такого підходу можна знайти у tests/multiclick/ та tests/stepgen.2/.