Соотношение типов тестов в проектах с исходным кодом
В Mull до недавнего времени была поддержка только юнит-тестов и использовать его в проектах, где не было юнит-тестов или преобладали тесты, написанные на скриптовых языках, было нельзя. Поэтому я хотел, чтобы эту возможность добавили и завёл на эту тему тикет. Одно дело это субъективное мнение отдельного человека, а другое дело это данные, на основе которых можно объективно оценить необходимость добавления фичи. Для обоснования своей точки зрения я сделал небольшое исследование, чтобы узнать какое соотношение юнит-тестов и интеграционных или модульных тестов в проектах с открытым исходным кодом и написанных на C/C++. Я исходил из предположения, что юнит-тесты написаны на языке проекта, а “большие” тесты на скриптовых языках. Для оценки объёма каждого типа тестов использовал количество строк кода одних и других тестов. Для исследования выбрал несколько самых популярных проектов: PostgreSQL, CRIU, OpenSSH, OpenBSD, QEMU, PUC Rio Lua, Tarantool, Git, FreeRDP. Результаты этого исследования на диаграмма ниже и комментировать тут думаю излишне.
PostgreSQL
В проекте большое количество тестов на SQL (61 KLOC) и на Perl (11 KLOC):
sergeyb@pony:~/sources/postgres/src$ cloc test/
1181 text files.
1109 unique files.
746 files ignored.
github.com/AlDanial/cloc v 1.82 T=0.51 s (856.0 files/s, 237744.5 lines/s)
Language files blank comment code
SQL 285 16287 12865 61340
Perl 68 2775 1994 11036
C 32 1679 2650 8742
make 40 275 218 851
Bourne Shell 6 60 41 282
yacc 1 28 11 170
C/C++ Header 4 35 63 106
lex 1 21 16 88
Python 1 5 0 13
SUM: 438 21165 17858 82628
CRIU
В проекте много тестового кода, написанного на Си (41 KLOC). Для инфраструктурных целей и автоматизации процесса тестирования используется Python (3.7 KLOC).
sergeyb@pony:~/sources/criu$ cloc test/
952 text files.
708 unique files.
368 files ignored.
github.com/AlDanial/cloc v 1.82 T=0.35 s (1684.1 files/s, 192424.4 lines/s)
Language files blank comment code
C 381 9528 1394 41388
Python 25 908 301 3701
Java 25 416 520 2799
Bourne Shell 83 551 159 2037
make 25 152 6 991
C/C++ Header 21 279 136 941
Bourne Again Shell 21 114 20 351
Protocol Buffers 3 48 26 173
XML 1 13 0 76
Expect 1 9 5 45
Maven 1 0 6 41
Markdown 1 10 0 40
SUM: 588 12028 2573 52583
OpenSSH
sergeyb@pony:~/sources/src/regress/usr.bin/ssh$ cloc .
319 text files.
309 unique files.
164 files ignored.
github.com/AlDanial/cloc v 1.82 T=0.09 s (1670.5 files/s, 193598.4 lines/s)
Language files blank comment code
C 32 729 384 6750
Bourne Shell 94 1177 735 6501
HTML 1 56 0 636
make 16 120 40 416
C/C++ Header 2 29 40 274
Standard ML 7 0 0 73
Pascal 2 0 0 2
ANTLR Grammar 1 0 0 1
SUM: 155 2111 1199 14653
OpenBSD
Тесты написаны на разных языках: C, Perl, Shell, Python. Инфраструктура для запуска тестов написана на Make, см. bsd.regress.mk.
sergeyb@pony:~/sources/src$ cloc regress/
19005 text files.
18627 unique files.
16013 files ignored.
github.com/AlDanial/cloc v 1.82 T=3.47 s (880.8 files/s, 82566.2 lines/s)
Language files blank comment code
C 899 18422 20172 142716
Perl 520 2910 3373 21978
make 958 6021 3559 21053
Bourne Shell 377 3783 2545 19827
Python 117 971 578 6282
Go 4 453 119 3181
C/C++ Header 52 466 944 2381
C++ 33 170 161 746
sed 8 52 151 709
HTML 1 56 0 636
Assembly 6 141 177 576
Korn Shell 4 32 37 283
m4 28 22 59 282
awk 3 38 37 202
Expect 13 1 3 112
diff 19 3 52 96
Standard ML 9 0 0 77
lex 1 2 1 6
JSON 2 0 0 2
Pascal 2 0 0 2
Lua 1 0 1 2
ANTLR Grammar 1 0 0 1
SUM: 3058 33543 31969 221150
QEMU
sergeyb@pony:~/sources/qemu$ cloc tests/
2494 text files.
2464 unique files.
866 files ignored.
github.com/AlDanial/cloc v 1.82 T=1.41 s (1290.6 files/s, 195783.4 lines/s)
Language files blank comment code
C 906 22462 17566 133769
Python 166 5949 6624 23483
Bourne Again Shell 235 5107 7435 16970
Assembly 185 2616 1272 12602
Bourne Shell 23 325 758 4820
C/C++ Header 78 955 2457 4297
JSON 200 139 0 3441
NAnt script 12 95 0 1563
Windows Resource File 2 131 0 940
make 11 88 67 492
YAML 2 20 48 33
XML 1 0 0 12
reStructuredText 2 3 4 8
SUM: 1823 37890 36231 202430
PUC Rio Lua
Для оценки использовал сторонний набор тестов (lua-Harness).
sergeyb@pony:~/sources/lua-5.4.3$ cloc lua-Harness/
253 text files.
248 unique files.
29 files ignored.
github.com/AlDanial/cloc v 1.82 T=0.48 s (463.9 files/s, 207700.7 lines/s)
Language files blank comment code
HTML 144 1328 0 86240
Lua 68 2114 1945 7523
make 7 181 43 658
CSS 1 54 64 401
Markdown 3 48 0 107
YAML 2 2 0 21
SUM: 225 3727 2052 94950
Tarantool
sergeyb@pony:~/sources/MRG/tarantool/test$ cloc .
2345 text files.
1873 unique files.
1329 files ignored.
github.com/AlDanial/cloc v 1.82 T=3.73 s (294.2 files/s, 79491.8 lines/s)
Language files blank comment code
Lua 920 30485 46225 188765
C 84 2431 2389 14137
C++ 21 683 337 4933
Python 21 364 304 1714
SQL 4 161 120 1169
INI 18 1 0 967
C/C++ Header 5 128 423 440
CMake 8 63 18 341
Markdown 1 4 0 32
YAML 16 0 0 19
SUM: 1098 34320 49816 212517
cgit
sergeyb@pony:~/sources/cgit$ cloc tests/
20 text files.
20 unique files.
1 file ignored.
github.com/AlDanial/cloc v 1.82 T=0.02 s (809.2 files/s, 40419.1 lines/s)
Language files blank comment code
Bourne Shell 17 166 32 717
Lua 1 4 0 13
make 1 6 0 11
SUM: 19 176 32 741
FreeRDP
Один из немногих проектов, в котором код разбит на компоненты и код тестов находится в одной директории с кодом компонента. Такой подход упрощает тестирование - запускаются только тесты для изменённого кода.
sergeyb@pony:~/sources/FreeRDP$ cloc .
294 text files.
294 unique files.
41 files ignored.
github.com/AlDanial/cloc v 1.82 T=0.31 s (822.0 files/s, 125955.6 lines/s)
Language files blank comment code
C 209 4942 1811 30055
CMake 40 407 33 872
C/C++ Header 4 48 56 542
SUM: 253 5397 1900 31469