1821教务系列命令行评测(民间)
自动化测试;任何人都可以贡献测试数据! 指南
软件在活跃开发中,欢迎试用并提交bug和建议!
为了及时获取更新,请watch本项目并确保能及时接收邮件!
遇到问题的时候,请确保已仔细阅读本README
NDbg是jwdbg的升级版。解决了jwdbg的局限性。当遇到这些局限性的时候,请考虑NDbg。
在提交前,为了避免低级错误,为了避免IDE手贱import的包,请参考这里
感谢以下测试数据的贡献者:
- crclz
- samshui
为了及时获取更新,请watch本项目并确保能及时接收邮件!
以下情况可能会造成你需要重新下载/fetch/pull文件:
- 测试程序发生更新
- 新的测试数据出来了
- 已发布的测试数据因为助教的需求澄清而发生修改
- 已发布的数据被增强
在这些情况下,请通过github watch的方式及时得到通知。
版本的变更将通过release的方式发出。当你watch了本项目的时候,github就会给你发站内通知+邮件通知。我发现手机qq的新邮件推送挺及时的。
- 能够测试程序能否输出指定内容
- 如果不能输出指定内容,会给出期望输出与实际输出的比较,并提供直到出错命令的输入数据进行检验,可以方便用于调试。如果用传统方式(in.txt,out.txt,对比程序输出和out.txt),无法实现精确定位到某条指令。说明
- 以yaml的方式书写测试数据,可读性高,易于扩展。查看示例
- python
3.7+
- 需要pyyaml模块
pip install pyyaml
- 拷贝
jwdbg.py
和jw04.yml
(或者jw04-samshui.yml)到java输出目录(一堆.class那个目录下) - 命令行进入那个目录,运行
python .\jwdbg.py -cmd "java Test" -case jw04.yml
python .\jwdbg.py -cmd "java Test" -case jw04.yml
-case
:测试用例文件
-cmd
: 运行目标程序的命令。
注意! 建议在java文件的生成目录下运行。即:以java生成目录为工作目录运行本测试程序。因为要照顾到java,因为java的classpath依赖于当前目录的位置。
所以,建议把这个测试程序拷贝到java生成目录(一堆.class)里去。或者使用绝对路径来运行此程序和传递参数。
-inputdata
: 附带此参数,程序的行为是:在控制台输出完整的测试输入。
如果测试失败,程序会:
- 打印出发生不一致的行的对比。
- 给出输入数据,便于用IDE来测试。例如,一共有20行输出,对应20条命令。程序在第15行输出的时候发生了不一致,那么就会提供第1-15行命令。
- 如果程序Timeout,请看常见问题
如果你认为测试数据出错了,不妨先浏览一下.yml测试数据,看看注释。编写者可能会在注释里面对“为什么是这个输出”进行解释。
python .\jwdbg.py -cmd "java Test" -case .\jw05.yml -inputdata
说明:虽然-cmd "java Test"
没什么意义,但是为了编程方便起见,还是要求必须有。
- JDK和JRE版本问题:当你使用IDEA编译和运行的时候,JDK和JRE的PATH设置是对开发没有影响的。当你使用命令行时,PATH的设置就有影响。请确保编译所用的java版本和运行所用的java版本相等(能兼容):以下提供2种不同的解决方案:
- 将
java Test
换成PATH_TO_JRE Test
,其中PATH_TO_JRE是目标JRE的路径。 - 修改在环境变量PATH中移除其他版本的jre并添加合适版本的jre。
- 将
- 超时异常:说明你的程序没有退出。要么是测试数据没有给出退出信号(例如QUIT),要么是你的程序有bug。请获取完整的测试输入数据并去IDE测试。
- 如果带package,请确保了解带package的类的命令行运行的正确指令。
- 因为某些局限性,所以程序在极少情况下会无法定位准确的造成错误的命令。
请不要使用多个scanner实例对System.in进行读(有2个同学踩了这个坑)。确保全程使用一个scanner。确保new Scanner(System.in)
只发生一次。
欢迎提交bug和建议到issue区。bug请尽量附带详细信息。
除非jwdbg.py有需要修复的bug,否则请不要贡献jwdbg.py的代码。
可以用issue的方式贡献数据,也可以用fork+PullRequest的方式。
测试数据以yaml书写。yaml和json的区别是:yaml对人类读写友好。
测试数据的结构,用json来表示,则是:
{
"name": "my test data",
"data": [
"SUDO",// 单行输入,无输出
["input1","output1"],// 单行输入,单行输出
["input2","output2\naaaaaaaa"],// 单行输入,多行输出
]
}
用yaml来表示,则是:
name: my test data
data:
- SUDO # 单行输入,无输出
-
- input1 # 单行输入,单行输出
- output1
-
- input2 # 单行输入,多行输出
- |
output2
aaaaaaaa
# 这是yaml对多行字符串的友好支持
具体可以参考jw04.yml
的内容。
附上yaml一般用法(部分):
data: # data:[a, b, [c,d] ]
- a
- b
- # 数组嵌套
- c
- d
程序的原理很简单: yml文件 --> 提取输入数据、期望的输出行 --> 运行目标程序,获取输出 --> 对比期望的输出和实际的输出
-
(此局限性在ndbg被解决) 在“对比期望的输出和实际的输出”过程中,程序无法获知哪一行输入产生了哪几行输出,所以在极少部分情况下,不能准确的定位出问题的输出行。这种情况下,如果你感到迷惑,
就请用IDE来调试请使用Ndbg。 -
jw pdf所要求提供的功能对于测试来说不够用。例如,在jw05中,SUDO状态下是无法使用gc命令。当然这也是需要侵入性的改动,所以只有当矛盾特别尖锐时,才会去做这个修改。