至诚学院测试代码编写小结

至诚学院测试代码编写小结

Github链接:https://github.com/ChildishChange/zcxyAutoTest

需求

获取 https://edu.cnblogs.com/campus/fzzcxy/2016SE/homework/2079

设计

命令行参数

json config

repo clone

初始化单个项目

遇到的困难

  1. 编译目录下的多个 java 文件

    使用通配符 *.java 即可

  2. 编译不同编码的 java 文件

    这个增加一个 javac -encoding UTF-8 java文件路径 就可以了

  3. 跨目录使用 java 运行 class 文件提示:“错误:找不到类或无法加载主类”

    • 问题描述:

      在目录 A 下运行测试程序,测试程序调用 cmd.exe ,此时 cmd.exe 的工作区是测试程序所在的目录,即目录 A。

      测试程序随即向 cmd.exe 输入如下命令,此时 java 报错。

    • 原因分析:

      java 指令默认在 CLASSPATH 环境变量中寻找 .class 文件。

      CLASSPATH为 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

      可以看到:第一个 ; 前有一个 . 。这表示搜索 class 文件时,jdk 首先在当前目录下查找。

      此时,“当前目录”即目录 A,jdk 在这个目录下必然找不到这个 class 文件,所以会报错。

    • 解决方案:

      添加 classpath 参数:java -classpath 相对类的路径 类名

    除此以外,还有另一种原因,就是 .java 文件首声明了 package 信息。

    • 原因分析:

      java 类的全名为包名 + 类名,声明 package 信息后,类 A 的全名就变成了a.b.c.A

      java 规定按照 package 路径存放源文件。

    • 解决方案:

      首先,在文件编译后,需要将class文件放置在 package 指定的目录下,例如包名为 a.b.c ,则class文件要放置在 a\b\c\ 目录下。

      然后,运行类时输入类的全名 : 包名 + 类名

      java -classpath 相对包的路径 包名.类名

    相关链接:

    https://www.cnblogs.com/wangxiaoha/p/6293340.html

    https://www.cnblogs.com/Wjh794010585/articles/6582079.html

  4. C#同时读取程序的标准输出流与标准错误流时可能会产生死锁

    • 错误描述

      程序调用 cmd.exe 时,重定向了进程的标准输出和标准错误,并使用了同步读取方式读取输出流和错误流。在读取输出流时,程序会所卡死。

      string output = p.StandardOutput.ReadToEnd();  
    • 分析原因

      同步读取操作引入了 读取标准输出流 的 调用方和 写入输出流 的 子进程之间的依赖。 这种依赖可能会导致死锁。当调用方从子进程重定向后的流中读取数据时,调用方依赖于子进程。调用方等待读操作,直到子进程完成写入并关闭流。当子进程写入了足够填满重定向流的数据时,它依赖于其父进程。子进程等待下一次写操作,直到父进程从完整流中读取并关闭流。于是死锁发生了。

      https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.process.standardoutput?redirectedfrom=MSDN&view=netframework-4.7.2#System_Diagnostics_Process_StandardOutput

    • 解决方案

      使用异步读取

总结与感想

教师/助教在决定使用自动测试后,一定要在作业中明确要求所有的测试点,当不明确规定测试点时,则一定需要在测试程序中增加对不同情况的支持

以本次作业为例。

我建议明确规定乘除法必须使用 ×÷ 符号,老师则认为可以不明确规定这一点,而把它作为需求分析的一点,希望学生能够得出这个需求。

而我在编写测试代码的时候也想的过于美好,按照 ×÷ 符号编写了测试代码。

结果,绝大多数学生没有得出这个需求,因此,他们的代码没有通过测试。

修改了代码之后,通过的同学变多了。

限制大家编写java使用的编码

你可能感兴趣的:(至诚学院测试代码编写小结)