2013-02-01 48 views
3

我写了一个命令行工具,我想测试(我不想从命令行运行单元测试)。我想将一组特定的输入选项映射到特定的输出。我一直无法找到任何现有的工具。该应用程序只是一个二进制文件,可以用任何语言编写,但它接受POSIX选项并写入标准输出。如何单元测试命令行界面

沿东西线:

  • 对于每个组已知的输入选项:规定输入
    1. 启动应用程序。
    2. 将输出输出到文件。
    3. 将差分输出存储到所需的输出。
    4. 如果diff不为空,则记录错误。

(顺便说一句,这就是你所谓的集成测试而非单元测试?)

编辑:我知道我会怎么去写我自己的工具为此,我不需要代码的帮助。我想了解的是,如果这已经完成。

+0

如果你决定要实现它,就没有必要*输出到文件*。您可以重定向输出并使用字符串代替。这样会更快,并且您将避免在单元测试中使用更多文件(完全没有建议)。 –

+0

不知道任何工具,但有几个建议a)使用数据驱动的测试来测试输入到您的命令行的变化组合b)添加一个步骤来检查您的工具的返回码,以便您不要依赖输出流数据 – allen

+0

@OscarMederos也许你不建议使用文件,但我总是这样做。除非测试输出可预测的很小,否则与通过基于缓存的现代文件系统访问的磁盘驻留文件相比,内存中的字符串是一个坏主意。 –

回答

0

嗯,我认为每种语言都应该有一种执行外部过程的方法。

在C#中,你可以这样做:

var p = new Process(); 
p.StartInfo = new ProcessStartInfo(@"C:\file-to-execute.exe"); 
... //You can set parameters here, etc. 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.RedirectStandardInput = true; 
p.StartInfo.UseShellExecute = false; 
p.Start(); 

//To read the standard output: 
var output = p.StandardOutput.ReadToEnd(); 

我从来没有写入标准输入,但我相信它可以通过访问p.StandardInput以及完成。这个想法是将两个输入视为Stream对象,因为这就是它们。

在Python中有subprocess模块。根据它的文档:

子进程模块允许你产生新的进程,连接到他们的输入/输出/错误管道,并获得他们的返回代码。

我不得不编写单元测试时的编译器的代码生成部分,我写在几个月前做同样的:Writing unit tests in my compiler (which generates IL)

+0

当我发布这个问题时,我也开始用Python编写一个工具。我知道如何解决这个问题,我想学习的是如果其他人已经做了同样的事情。 – Mizipzor

+0

@ mizipzor好吧,包含真正问题的问题的唯一部分是:*如何单元测试命令行界面*。如果你正在寻找一个现有的工具或其他东西,那么你应该编辑它。 –

-2

当然,它已经做了字面上数千次。但是编写一个工具来运行简单的shell脚本或批处理文件,就像你所提议的那样,这是一项简单的任务,几乎不值得试图变成一个通用工具。

+0

当然,我不能成为第一个希望有一个通用工具的人吗? – Mizipzor

+0

'xxx 2>&1> results.txt&diff -q expected.txt result.txt'有多难? –

5

DejaGnu是用于编写CLI程序测试套件的成熟且有点标准的框架。

下面是这个tutorial抽取的样本测试:

# send a string to the running program being tested: 
send "echo Hello world!\n" 

# inspect the output and determine whether the test passes or fails: 
expect { 
    -re "Hello world.*$prompt $" { 
     pass "Echo test" 
    } 
    -re "$prompt $" { 
     fail "Echo test" 
    } 
    timeout { 
     fail "(timeout) Echo test" 
    } 
} 

使用这样一套行之有效的框架很可能将是比任何东西从长远来看,你可以更好的拿出你自己,除非你需求非常简单。

3

您正在寻找BATS(猛砸自动测试系统): https://github.com/bats-core/bats-core

从文档:

example.bats contains 
#!/usr/bin/env bats 

@test "addition using bc" { 
    result="$(echo 2+2 | bc)" 
    [ "$result" -eq 4 ] 
} 

@test "addition using dc" { 
    result="$(echo 2 2+p | dc)" 
    [ "$result" -eq 4 ] 
} 


$ bats example.bats 

✓ addition using bc 
✓ addition using dc 

2 tests, 0 failures