└── lab09
├── Doxyfile
├── Makefile
├── README.md
├── test
│ └── test.c
└── src
├── lib.c
├── lib.h
└── main.c
Зверніть увагу. Для роботи з тестами вам потрібно:
- Додати файл з тестами (файл
./test/test.c
) - інсталювати утиліту libcheck (див. https://libcheck.github.io/check/web/install.html)
- В Makefile додати цілі для компіляції та запуску тестів (файл
./test/test.c
) з доданням опції-lcheck
. Наприклад (код взято зsample_project
):
compile: main.bin test.bin
test.bin: test/test.c
$(CC) $(C_OPTS) $< -fprofile-instr-generate -fcoverage-mapping -o ./dist/$@ -lcheck
test: clean prep compile
LLVM_PROFILE_FILE="dist/test.profraw" ./dist/test.bin
llvm-profdata merge -sparse dist/test.profraw -o dist/test.profdata
llvm-cov report dist/test.bin -instr-profile=dist/test.profdata src/*.c
llvm-cov show dist/test.bin -instr-profile=dist/test.profdata src/*.c --format html > dist/coverage.html
- Переробити попередній проект (робота з функціями) на багатофайлову структуру, в якої:
main.c
- складається з тестового запуску функцій для завідомо відомих данихlib.c
- складається з реалізації розроблених функійlib.h
- складається з прототипів розроблених функцій, що документовані
- Для попередньо розробленої функції (функцій) додати методи – модульні тести, що демонструють коректність роботи розробленого функціоналу. Розроблені методи мають перевірити коректність функціонування функцій на наборі заздалегідь визначених вхідних-вихідних даних.
Приклад файл-тесту для веріфікації додатку 2 чисел (функция int sum(int a, int b);
) (без коментарів):
#include "lib.h"
#include <check.h>
START_TEST(test_sum)
{
#define DATA_SIZE_SUM 3
int input_data_a[] = { 1, 3, -1 };
int input_data_b[] = { 2, 0, 10 };
int expected_values[] = { 3, 3, 9 };
for (int i = 0; i < DATA_SIZE_SUM; i++) {
int actual_value = sum(input_data_a[i], input_data_b[i]);
ck_assert_int_eq(expected_values[i], actual_value);
}
}
END_TEST
int main(void)
{
Suite *s = suite_create("Programing");
TCase *tc_core = tcase_create("lab09");
tcase_add_test(tc_core, test_sum);
suite_add_tcase(s, tc_core);
SRunner *sr = srunner_create(s);
srunner_run_all(sr, CK_VERBOSE);
int number_failed = srunner_ntests_failed(sr);
srunner_free(sr);
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
Зверніть увагу. Дана лабораторна робота не передбачає наявності звіту
- Що таке модульний тест?
- Як протестувати функцію конкатенації двох рядків?
- Як протестувати функцію об’єднання двох масивів?
- Як запустити модульний тест?
- Коли виконуються модульні тести?
- Які принципи модульного тестування?
- Навіщо потрібні модульні тести? Які ще бувають тести?