有没有语言不可知的单元测试框架?[关闭]


11

我一直对重写工作代码持怀疑态度-移植代码也不例外。但是,随着TDD和自动化测试的到来,重写和重构代码更加合理。

有谁知道是否存在可用于移植旧代码的TDD工具?理想情况下,您可以执行以下操作:

  1. 为通过的旧代码编写语言不可知的单元测试(如果发现错误,则失败)。
  2. 在失败的其他代码库上运行单元测试。
  3. 用通过测试的新语言编写代码,而无需查看旧代码。

另一种选择是将步骤1分为“用语言1编写单元测试”和“将单元2移植到语言2”,这将显着增加所需的工作量,并且很难证明是否要在维护旧代码库之后停止维护端口(也就是说,您无法在此代码库上获得持续集成的好处)。

编辑:值得注意在StackOverflow上的此问题


提供纯文本命令协议,然后用于expect实施测试。
SK-logic

我没有听说过@ SK-logic expect。如果您拥有使用stdin和stdout与管道进行通信的Unix风格的旧系统,那么可以肯定使用该工具。实际上,使用任何脚本语言进行测试也将非常容易。
Bringer128

为什么遗产?您也可以使用Unix风格的现代系统。无论如何,从来没有任何理由不为任何功能提供脚本接口。
SK-logic

@ SK-logic很抱歉,不清楚。我说“传统”是因为移植通常是从legacy language x到完成的fancy new language y。我并不是想暗示有关Unix的任何信息!
Bringer128

@ Bringer123,顺便说一句,在没有任何适当的Unix支持(例如,没有适当的管道)的情况下,进行此类类似unix的集成的小技巧是嵌入脚本语言并通过TCP端口提供对REPL的访问( REPL在单独的线程中运行)。它既是功能强大的调试工具,又是测试自动化引擎。这种方法几乎适用于所有情况(嵌入式脚本语言可能很小,在资源有限的情况下甚至可以算是Forth)。
SK-logic

Answers:


6

我认为不可能用另一种语言编写单元测试。

但是,您可以做的是编写集成/接受/用户界面/ whatverver_you_name_it测试,该测试非常高级,并且与您使用软件编写的语言无关。

如果您的应用程序是Web服务,则只要它支持您的协议,就可以使用您想要的任何语言对其进行测试。如果您的应用程序在浏览器中运行,则可以使用selenium(这是我想到的第一个,但是还有其他一些。等等。我可能在某些情况下认为它不起作用(也许是硬件方面的东西),这全都取决于有关您正在处理的应用程序类型的信息。

当然,您所获得的覆盖范围不会与单元级测试相同(除非花费大量时间),但是至少,您将拥有一个测试工具。


+1用于自动高级测试。这些绝对值得付出努力。
Bringer128

1
“我认为用另一种语言编写单元测试是不可能的。” :反例:在.NET中,您可以用Visual Basic(或任何其他支持.NET的语言)编写C#的单元测试。几年前,Microsoft甚至将此作为最佳实践加以推广,因为它降低了同时编写代码和测试与该语言相关的相同错误(尤其是程序员对此的相对误解)的风险。同意,不会在Fortran中编写单元测试来测试PHP代码。
2014年

2

我认为最接近您想法的是基于虚拟机的生态系统(例如Java VM)上的单元测试框架。至少Scala(我也相信Groovy,我对Clojure不太确定)几乎可以与Java完美地互操作。也就是说,可以使用JUnit测试Scala代码,并且可以使用ScalaTest测试Java代码。这样,您可以(逐步或立即)在Scala中重写Java代码,并继续使用相同的旧Java单元测试来验证其正确性。(或者反过来-尽管我无法想象从Scala迁移回Java的正当理由。)

.NET CLI上的语言,例如C#,F#,ASP.NET等,可能也是如此。

但是,在VM / CLR之外,这更加困难。从理论上讲,一个人可以将单元测试和/或被测代码编译成另一种语言,例如C(像过去的C ++等新语言一样,并且很常见),但是我还没有听说有人专门用单元测试。


1
我想这说明了我的问题所在。如果它们可以轻松互操作,为什么要移植?如果不能,那么语言障碍将使它不可能进行跨语言单元测试。
Bringer128

@ Bringer128,新型JVM语言的支持者声称,与Java相比,用更少的代码和更简洁的代码可以更快地解决特定问题。到目前为止,我对Scala的有限经验证实了这一点。
彼得Török

Groovy也可以与Java互操作。
user281377 2014年

1

这样的框架不存在,因为它需要使用所用代码的语言编写。

例如,需要使用c或c ++编写用于测试c ++代码的框架。可以使用用c ++编写的框架,但如果它使用c ++功能,则不会测试ac代码。


1

方法各不相同,但就我而言,我的TDD测试中有很大一部分倾向于“集成测试”风格,而不是“单元测试”风格。也就是说,我中的大多数人都在接近真实的查询中测试整个程序,并检查适当的响应。

在少数情况下,当我编写网络驱动程序(主要是特定于应用程序的协议)时,我没有方便使用的完整测试框架,因此我在“跨网络”中进行了大多数测试,简而言之,我用另一种语言编写了一个非常简单的客户端,它具有一个通用且简单的测试框架,并且大多数测试都检查服务器的响应。

尽管如此,即使在那种情况下,我还是在实际应用程序中注入了一些手动测试来测试一些非网络部分。


0

语言不可知的测试框架是适用于验收测试(观点)的通用测试框架,该框架中的测试用例由QA管理,例如Robotframework


2
在先前的4个答案中,这似乎并没有提供实质性的要点和解释
gnat 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.