/jwdbg

1821教务系列命令行评测(民间) 和数据

Primary LanguagePython

jwdbg

1821教务系列命令行评测(民间)

自动化测试;任何人都可以贡献测试数据! 指南

软件在活跃开发中,欢迎试用并提交bug和建议!

为了及时获取更新,请watch本项目并确保能及时接收邮件!

遇到问题的时候,请确保已仔细阅读本README

NDbg

NDbg是jwdbg的升级版。解决了jwdbg的局限性。当遇到这些局限性的时候,请考虑NDbg。

提交前的测试

在提交前,为了避免低级错误,为了避免IDE手贱import的包,请参考这里

贡献者

感谢以下测试数据的贡献者:

  • crclz
  • samshui

获取版本更新

为了及时获取更新,请watch本项目并确保能及时接收邮件!

以下情况可能会造成你需要重新下载/fetch/pull文件:

  • 测试程序发生更新
  • 新的测试数据出来了
  • 已发布的测试数据因为助教的需求澄清而发生修改
  • 已发布的数据被增强

在这些情况下,请通过github watch的方式及时得到通知。
版本的变更将通过release的方式发出。当你watch了本项目的时候,github就会给你发站内通知+邮件通知。我发现手机qq的新邮件推送挺及时的。

附带数据

功能特点

  • 能够测试程序能否输出指定内容
  • 如果不能输出指定内容,会给出期望输出与实际输出的比较,并提供直到出错命令的输入数据进行检验,可以方便用于调试。如果用传统方式(in.txt,out.txt,对比程序输出和out.txt),无法实现精确定位到某条指令。说明
  • 以yaml的方式书写测试数据,可读性高,易于扩展。查看示例

前提条件

  • python3.7+
  • 需要pyyaml模块 pip install pyyaml

傻瓜式运行测试(以jw4为例)

  1. 拷贝jwdbg.pyjw04.yml(或者jw04-samshui.yml)到java输出目录(一堆.class那个目录下)
  2. 命令行进入那个目录,运行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: 附带此参数,程序的行为是:在控制台输出完整的测试输入。

阅读测试结果

如果测试失败,程序会:

  1. 打印出发生不一致的行的对比。
  2. 给出输入数据,便于用IDE来测试。例如,一共有20行输出,对应20条命令。程序在第15行输出的时候发生了不一致,那么就会提供第1-15行命令。
  3. 如果程序Timeout,请看常见问题

如果你认为测试数据出错了,不妨先浏览一下.yml测试数据,看看注释。编写者可能会在注释里面对“为什么是这个输出”进行解释。

获取完整的测试输入数据

python .\jwdbg.py -cmd "java Test" -case .\jw05.yml -inputdata

说明:虽然-cmd "java Test"没什么意义,但是为了编程方便起见,还是要求必须有。

常见问题

  1. JDK和JRE版本问题:当你使用IDEA编译和运行的时候,JDK和JRE的PATH设置是对开发没有影响的。当你使用命令行时,PATH的设置就有影响。请确保编译所用的java版本和运行所用的java版本相等(能兼容):以下提供2种不同的解决方案:
    • java Test换成PATH_TO_JRE Test,其中PATH_TO_JRE是目标JRE的路径。
    • 修改在环境变量PATH中移除其他版本的jre并添加合适版本的jre。
  2. 超时异常:说明你的程序没有退出。要么是测试数据没有给出退出信号(例如QUIT),要么是你的程序有bug。请获取完整的测试输入数据并去IDE测试。
  3. 如果带package,请确保了解带package的类的命令行运行的正确指令。
  4. 因为某些局限性,所以程序在极少情况下会无法定位准确的造成错误的命令。

Exception ... No line found

请不要使用多个scanner实例对System.in进行读(有2个同学踩了这个坑)。确保全程使用一个scanner。确保new Scanner(System.in)只发生一次。

Bug与建议

欢迎提交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文件 --> 提取输入数据、期望的输出行 --> 运行目标程序,获取输出 --> 对比期望的输出和实际的输出

局限性

  1. (此局限性在ndbg被解决) 在“对比期望的输出和实际的输出”过程中,程序无法获知哪一行输入产生了哪几行输出,所以在极少部分情况下,不能准确的定位出问题的输出行。这种情况下,如果你感到迷惑,就请用IDE来调试 请使用Ndbg。

  2. jw pdf所要求提供的功能对于测试来说不够用。例如,在jw05中,SUDO状态下是无法使用gc命令。当然这也是需要侵入性的改动,所以只有当矛盾特别尖锐时,才会去做这个修改。