Соотношение типов тестов в проектах с исходным кодом

В 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
Теги: softwaretesting