惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
量子位
博客园_首页
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Forbes - Security
Forbes - Security
IT之家
IT之家
N
News and Events Feed by Topic
S
Security Affairs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Webroot Blog
Webroot Blog
Recorded Future
Recorded Future
L
LangChain Blog
Y
Y Combinator Blog
AI
AI
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google Online Security Blog
Google Online Security Blog
V2EX - 技术
V2EX - 技术
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
I
Intezer
T
Tenable Blog
G
Google Developers Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
C
CXSECURITY Database RSS Feed - CXSecurity.com
有赞技术团队
有赞技术团队
O
OpenAI News
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
S
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
Blog — PlanetScale
Blog — PlanetScale

Super Blog

[译] 我所知道的全部智能体工程技巧(2026 年 6 月) 2024:悲观者正确,乐观者前行 Overleaf LaTeX citation 无法正常显示问题解决 Mac 终端无法联网问题解决 我和我的 2023 新起点 使用 Arc 浏览器自定义网页 我和我的 2022 Genius Bar 两日游 实训小记 《软件测试技术》笔记 Q-Learning 简介 我和我的 2021 写过的第二个 App 在 SwiftUI 中自定义修饰器 关于最近,以及…… 《数据库原理》笔记 《数字逻辑与数字系统》笔记 《形式化方法》笔记 宣言
软件测试技术实验 3 和 4 遇到的一些问题和解决方案
SUPER · 2022-03-23 · via Super Blog

最近写《软件测试技术》实验 3 和实验 4 时,遇到了一些工具上的问题,并尝试了一些解决方案,记录一下。

实验 3:MuJava

MuJava 是一个变异测试的工具,可以生成变异体并运行,最终可以得到变异测试的结果。

变异测试是衡量测试充分性的有效方法,其思想就是模拟程序编写中可能会出现的错误,得到一系列和源程序不同的“变异体”,用来“测试”你的测试程序是否能测出来这些“变异”。你的测试程序杀死(使变异体的运行结果不同于源程序)的变异体越多,测试越充分。

0x00 安装 MuJava

  1. 直接到 官网 下载 mujava.jar

  2. 为了后续实验进行,还需要下载 junit.jar(编写测试程序)、openjava.jar

  3. 保存三个 jar 包到固定路径,编辑 ~/.bash_profile 引入环境:

    1
    2
    3
    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:/path/to/openjava.jar:/path/to/junit.jar:/path/to/mujava.jar

    (适用于 macOS,Windows 略有不同)

  4. 保存并运行 source ~/.bash_profile

  5. 为了使用 MuJava,需要创建需要的目录结构:

    1
    2
    3
    4
    5
    |--\classes\
    |--mujava.config
    |--\result\
    |--\src\
    |--\testset\

0x01 生成变异体

  1. 将源文件移至 \src\ 目录。
  2. javac 编译源文件,得到 classes 文件,移至 \classes\ 目录。
  3. 运行 java mujava.gui.GenMutantsMain,进入图形化设置界面,勾选需要生成变异体的文件和需要的变异算子,点击 Generate 即可生成(保存在 result 目录)。

若此处出现问题,请检查 0x00 第 3 步中路径是否包含空格。即使使用 \ 转译也可能存在问题,建议用 -_ 代替空格。

0x02 生成测试集

使用 JUnit 编写即可,比较简单,得到 xxxTest.java

0x03 运行变异测试

  1. javac 编译测试文件,得到 classes 文件,移至 \testset\ 目录。
  2. 运行 java mujava.gui.RunTestMain > TestResult.log,将变异测试日志输出至文件保存。

若此处出现问题,请检查 0x00 第 3 步中是否引入了 $JAVA_HOME/lib/tools.jar$JAVA_HOME/lib/dt.jar

变异测试完成,后续可以进一步分析测试代码和变异体,做进一步改进。

实验 4:Major

Major 和 Mujava 功能相近,也是变异测试的工具。

0x00 安装 Major

  1. 直接到 官网 下载 Major v1.3.5,解压为 major 目录,存放到固定路径。

  2. 配置环境变量:

    1
    export PATH=/path/to/major/bin:$PATH:$JAVA_HOME/bin

    保存并运行 source ~/.bash_profile

  3. 验证是否配置成功:

    1
    2
    3
    4
    ❯ javac -version
    javac 1.7.0-Major-v1.3.5
    ❯ ant -version
    Apache Ant(TM) version 1.8.4-Major-v1.3.5 compiled on July 18 2019

如果验证时得到的输出和上述不同,特别是 javac -version 输出结果不包含 Major-v1.3.5,建议检查第 2 步引入环境变量的顺序,应将 major/bin 目录放在最前面。

0x01 配置文件

  1. Major 使用 ant 运行变异测试,并在 major/example/ 目录下给出运行模板。所以我们需要依此建立目录结构:

    1
    2
    3
    4
    |--\src\
    |--\test\
    |--build.xml
    |--run.sh
  2. 将源文件移至 src 目录,将 JUnit 测试文件移至 test 目录。

请确保代码文件的 package 和目录结构对应,参照给出的运行模板。

build.xmlrun.sh 是 Major 运行的重要文件,前者是配置文件、后者是运行脚本。由于运行目录不同,所以在运行前我们需要在 example 的基础上,根据自己的实际情况对两个文件做一些修改。

build.xml

  1. 可以在第一行修改自己的项目名称:

    1
    <project name="YourProjectName" default="compile" basedir=".">
  2. 修改 /javac/ 文件的路径:

    1
    <property name="major" value="/your/path/to/major/bin/javac"/>

    它上面两行一般不需要改动。

run.sh

  1. 修改 /major/ 目录的路径:

    1
    MAJOR_HOME="/your/path/to/major"
  2. 如果没有编写 MML 脚本(一般情况下不需要自己编写),修改 ant 运行的参数:

    1
    $MAJOR_HOME/bin/ant -DmutOp=":ALL" clean compile

    直接指定为 ALL 对应全部变异算子,若此处不修改可能会导致后续生成变异体数量为 0。

0x02 运行变异测试

运行 ./run.sh,得到类似下方的输出则成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
...
mutation.test:
[echo] Running mutation analysis ...
[junit] MAJOR: Mutation analysis enabled
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: Run 1 ordered test to verify independence
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: Preprocessing time: xxx seconds
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: Mutants generated: xxx
[junit] MAJOR: Mutants covered: xxx (xx.xx%)
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: Export test map to testMap.csv
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: Run mutation analysis with 1 individual test
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: 1/1 - UpgradedTriangleTest (xxms / xxx):
[junit] MAJOR: xxx (xxx / xxx / xxx) -> AVG-RTPM: xms
[junit] MAJOR: Mutants killed / live: xxx (xxx-x-x) / xx
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: Summary:
[junit] MAJOR:
[junit] MAJOR: Analysis time: x.x seconds
[junit] MAJOR: Mutation score: xx.xx% (xx.xx%)
[junit] MAJOR: Mutants killed / live: xxx (xxx-x-x) / xx
[junit] MAJOR: Mutant executions: xxx
[junit] MAJOR: ------------------------------------------------------------
[junit] MAJOR: Export summary of results to summary.csv
[junit] MAJOR: Export run-time results to results.csv
[junit] MAJOR: Export mutant kill details to killed.csv

BUILD SUCCESSFUL
Total time: x second

和 MuJava 类似,后续可以进一步分析测试代码和变异体,做进一步改进。

如果 Mutants covered 未达到 100%,请移除源程序的 main 方法。

0x03 其他问题

如有其他问题,强烈建议阅读 官方文档,十分详细。