首页 > 其他分享 >变异测试

变异测试

时间:2022-08-15 15:35:43浏览次数:69  
标签:mull 变异 -- 测试 算子 test txt crm

由于本项目于实习期间完成,已隐去涉及到公司内部代码的部分。

前期准备部分

1. MULL工程结构

MULL工程的最新资料:https://mull.readthedocs.io/en/latest/GettingStarted.html

mull.yml

mutators  #变异算子
excludePaths   #文件过滤
timeout   #超时时间

2. 工程编译

编译cmake文件等步骤需要在cmakelist所在的目录下执行,与测试用例test.py并不一定会是统一目录,编译时需注意目录的切换问题。

手动编译步骤如下:

cmake .      #做cmake文件,生成工程可执行文件
make -j 32       #编译32位工程
cd ../mull-runner-12 ../xx.so -ide-reporter-show-killed --workers=16 -test-program=python -- test.py ./test   #命令行输出mull runner分析报告,打印killed mutations

注意:如果mull.yml发生更改,工程编译前需要清理cmake缓存(/usr1/513C00/dt/crm/st/CMakeCache.txt)等工程中间生成文件,否则影响分析结果。

已将编译自动化,执行mull.py脚本即可完成上述操作。

MULL工程使用SQLite报告

启用SQLite保存mull runner分析结果:

/usr/wangtao/mull/tools/mull-runner/mull-runner-12 /usr1/513C00/dt/crm/st/build/output/libumpt.so --reporters=SQLite --report-name=tutorial --workers=16 -test-program=python -- crm_test.py ./crm_test   #SQLite输出mull runner分析报告

-reporters=SQLite启用SQLite数据库,-report-name指定报告名称。

该数据库中包含两个表,mutant和information。information表中主要存储mull工程的版本号等信息,mutant表中存储了变异算子的名称、突变位置以及每个突变的执行信息:持续时间、状态(通过、失败等)等。通过mutant表可以定制个性化分析报告,例如统计变异分数等。

stdout/stderr的输入输出会大大增加数据库的储存空间,若不需要输出,可以通过--no-output, --no-test-output, --no-mutant-output禁用stdout/stderr。

自动化执行实现

mull.py自动化脚本实现流程如下:
image

需要提供的外部文件:oprator.txt, so.txt, test.txt
执行脚本:mull.py (实现编译、运行自动化)
输出:多个以算子+so命名的sqlite数据库及txt报告

analysis.py自动化脚本实现流程如下:
image

输入:mull.py输出的多个以算子+so命名的sqlite数据库
执行脚本:analysis.py (生成全局数据分析报告)
输出:tutorial.sqlite, tutorial.txt

1. 自动输出txt分析报告

实现目标:将原本打印在terminal的变异分析报告内容写入txt文件并输出
通过python脚本操作SQLite数据库,输出以算子+so命名的txt报告 (e.g. cxx_add_assign_to_sub_assign_xx.txt):
image

报告中包含以下主要内容:

Killed_mutants  # killed算子数量
Survived_mutants  # 存活数量
Total_mutants
Mutation_score  # of killed mutants / # of all mutants mutant Passed
Total_excution_time  # 算子执行总时间
------------------------------------
#  每个算子的具体信息,主要包含算子名称、变异位置、执行时间、执行状态(1: failed, 2: passed, 3: timeout)
mutant_id  ## id组成:算子名+文件路径+变异位置行号+变异位置列号
mutator  ## 算子名称
filename  ## 发生变异位置的文件名en
line_number ## 发生变异位置的行号
columm_number  ## 发生变异位置的列号(以字符数计)
status ## 执行状态(killed means that the status of a mutant is anything but Passed)
duration  ## 算子执行时间

2. 编译可控制实现

实现目标:将原本一次性写在mull.yml的变异算子修改为外部逐一加载
operator.txt中提供要执行的所有变异算子(可以是全量算子),Python读取txt中的算子名称,并逐一写入mull.yml文件mutators处,循环读取单个算子进行自动编译。

3. 运行可控制实现

实现目标:将原本写在crm_test指定的测试套修改为外部载入,将原本手动执行的运行命令中指定的so文件修改为外部读取
针对多用例列表场景,test.txt中提供用例列表,一次性写入test.py。

so.txt中提供要分析运行的so文件,逐一形成Mull-runner command。

4. 数据分析

实现目标:将多个算子+so.txt报告进行数据去重合并
id相同且status相同的记录去重:同一个算子在相同的位置发生变异,且运行结果相同(都被killed/survived),区别在于执行时间不同,只保留一个记录。

id相同且status不同的记录去重:同一个算子在相同的位置发生变异,但运行结果不同(一次被killed,一次survived)。当killed_mutants数据视图中已经存在该id号的算子执行结果,则在建立survived_mutants视图时不把该id号的记录筛选进来。

去重后生成全局分析报告tutorial.txt:
image

实现问题记录

问题1:
使用mull-runner运行分析:

/usr/wangtao/mull/tools/mull-runner/mull-runner-12 /usr1/513C00/dt/crm/st/build/output/libumpt.so --reporters=SQLite --report-name=tutorial --workers=32 -test-program=python -- crm_test.py ./crm_test

报了worker数量大于core数量的警告信息: [warning] You choose a number of workers that exceeds your number of cores. This may lead to timeouts and incorrect results

查询core数量为16:

$ cat /proc/cpuinfo |grep "cores"|uniq
cpu cores       : 16

将指令修改为:

/usr/wangtao/mull/tools/mull-runner/mull-runner-12 /usr1/513C00/dt/crm/st/build/output/libumpt.so --reporters=SQLite --report-name=tutorial --workers=16 -test-program=python -- crm_test.py ./crm_test

问题2:
编译运行结束后仍会有很多残留的进程,每次执行清理:ps aux | grep crm_test | awk '{print $2}' | xargs -I {} kill -9 {}

问题3:
仅清理CMakeCache文件,上一个变异算子仍会带到本次编译运行中,需要清理全部的中间文件。

/usr1/513C00/dt/crm/st路径下新建build文件夹,并在该目录下运行cmake构建工程。所有的中间文件都在build中,每次删除

mkdir build
cd build
cmake ..  # 在build目录下生成所有中间文件
make
rm -rf build  # 删除文件夹

执行mull.py脚本自动清除中间文件。

标签:mull,变异,--,测试,算子,test,txt,crm
From: https://www.cnblogs.com/IcyYs/p/16580657.html

相关文章