【怎么测试】1. 如何测试命令行程序?

来源:互联网 发布:身份证ocr识别软件 编辑:程序博客网 时间:2024/05/15 23:44

命令行程序的特点

    与其它应用程序相比,基于cmd-line的程序有以下几个特点:

  1. 启动文件带参数
  2. 通过std.in进行输入
  3. 通过std.out,std.err进行输出

 

问题

如果你想使用junit进行测试而不是每次都手工的在黑色的cmd中测试的话,就需要解决与之对应的这几个问题:

  1. 如何在junit中启动main函数?
  2. 如何向std.in中输入测试数据?
  3. 如何从std.out/std.err中读取结果?

 

程序样例

1.如何在junit中启动main函数?

程序代码

public class Demo {public static void main(String[] args) {for (int i = 0; i < args.length; i++) {String string = args[i];P.rintln("NO." + i + "'s parameter is " + string);}}}


测试代码

@Testpublic void testMain() {String[] strings = {"save","c:\\"};Demo.main(strings); }

调用main()函数的感觉和普通的静态方法基本一致。


2.如何向std.in中输入测试数据?

测试代码

@Testpublic void testMain() {String data = "Hello, World!\r\n"; InputStream stdin = System.in;  //保存原始的标准输入try {   System.setIn(new ByteArrayInputStream(data.getBytes()));//重定向,这里核心代码,重定向到其它的流中  ReadLineFromSystemIn.main(null);//调用应用程序} finally { System.setIn(stdin);  //还原} }

3.如何从std.out/std.err中读取结果

测试代码


@Testpublic void testMain2() {String data = "lalala\r\nlalalala\r\n";String expected = "read line 1: lalala\\s+read line 2: lalalala";InputStream stdin = System.in;PrintStream stdout = System.out;// 保存原有的try {System.setIn(new ByteArrayInputStream(data.getBytes()));// 重定向输入ByteArrayOutputStream baos = new ByteArrayOutputStream();System.setOut(new PrintStream(baos));// 重定向输出ReadLineFromSystemIn.main(null);// 打好桩后,应用程序启动assertTrue(Regexp.isLike(expected, baos.toString()));} finally {System.setOut(stdout);// 还原System.setIn(stdin);}}