2011-12-23 47 views
1

您好我写我的第一个Java应用程序,我已经有了一些测试用例(* .TC文件)我想直接通过这个脚本的应用程序:如何用Java编写简单的txt测试用例

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 

和工作就像当我手动输入“跳槽”,therfore测试用例通过。 然而,当我写另一TC:quit2.tc包含

lala 
test 
quit 

第一命令后,应用程序退出(因为readString功能似乎无效之后返回)。 这里是负责读取功能:

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

+0

密切OS资源这是您的_all_代码?您似乎没有在测试脚本中调用'readString()'方法......并且,每次调用方法时,您都不会通过创建新读取器来进行任何操作 - 创建的开销可能会降低以抵消使用缓冲的任何收益。并尝试通过调试来运行它 - 因为try-catch,如果遇到错误,您仍然可以返回null。 – 2011-12-23 16:37:29

+0

从脚本的角度来看,当你的文件名中有空格时,“for循环”就会搞乱。在'* .tc'中使用''f并在变量周围使用“”。 – 2011-12-23 16:40:39

+0

谢谢Jaypal的提示。 – wpp 2011-12-23 18:15:55

回答

3

如果你是新来的Java,你仍然塑造你的风格和处事方式,我会建议你2个提示:

1)使用Scanner读你的输入。 Scanner对象的使用nextLine()方法可能是您要查找的内容。

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

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

UPDATE:尽量实现你的功能如下:

一),则在扫描实例hasNextLine()是真实的 - >

B)调用扫描仪的实例nextLine()方法 - >

c)中解析行,看它是否等于 '退出' - >

d)执行相应逻辑if的情况。

0

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

由于每次调用readString()时都会创建一个新的BufferedReader,所以第一个阅读器会吞噬大部分文件(或全部),而第二个阅读器会打到文件结尾。

解决的办法是把读者带入一个领域,创建一次,然后始终使用相同的读者来电readLine()

另外,你永不落幕的读者。

Java将忘记使用的对象,但你必须正确喜欢FileInputStream小号

相关问题