如何在java中编写简单的文本测试用例

时间:2011-12-23 16:24:37

标签: java bash redirect testcase

您好我正在编写我的第一个Java应用程序,并且我有一些测试用例(* .tc文件)我想通过此脚本直接访问该应用程序:

for f in `ls *.tc`; do
  echo "Current Testcase: $f"
  x=${f%.*}
  java Main < $x.tc > $x.out

  if diff "$x.out" "$x.should"; then
    echo "passed testcase $f"
    let PASSED=PASSED+1
  else
    echo "failed testcase $f"
    let FAILED=FAILED+1
 fi
done

问题是我无法弄清楚为什么只要tc file包含多行,该应用程序就会疯狂。例如:quit.tc包含

quit

并且就像我手动输入“quit”时一样,因此测试用例通过。 但是,当我写另一个包含

的tc:quit2.tc
lala
test
quit

应用程序在第一个命令之后退出(因为readString函数似乎在之后返回null)。 这是负责阅读的功能:

public String readString(){

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String answer = null;

try {
  answer = br.readLine();
  return answer;
}
catch(IOException ioe) {
  System.out.println("IO Error");
}
return answer;
}   

我不知道为什么或当我重定向到应用程序时此函数返回null,这似乎是问题。你可以帮忙,所以我可以让tc脚本工作吗? THX

2 个答案:

答案 0 :(得分:3)

如果你是java新手,并且你仍然塑造自己的风格和做事方式,我会向你推荐2个提示:

1)使用Scanner来阅读您的输入。使用Scanner对象的nextLine()方法可能正是您所需要的。

2)设计您的代码,以便通过JUnit测试它。

仍然在您的readString()方法中,从try块中删除return answer;

更新:尝试在您的函数中实现以下内容:

扫描程序实例hasNextLine()为true时

a) - &gt;

b)调用扫描程序实例nextLine()方法 - &gt;

c)解析该行,看看它是否等于'退出' - &gt;

d)实施相应的逻辑if案例。

答案 1 :(得分:0)

您的问题是BufferedReader:它会立即读取整个文件(出于性能原因)。

由于每次调用BufferedReader时都会创建一个新的readString(),因此第一个读取器将吞下大部分文件(或全部文件),第二个读取器将触发文件结尾。

解决方案是将阅读器放入一个字段,创建一次,然后始终使用同一个阅读器来调用readLine()

另外,你永远不会关闭阅读器。

Java将忘记未使用的对象,但您必须正确关闭操作系统资源,如FileInputStream s