Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用不同的语言对程序进行单元测试是否可以接受? 我有一个C++库创建的静态库,想用驱动代码测试这个。_Python_C++_Unit Testing - Fatal编程技术网

Python 用不同的语言对程序进行单元测试是否可以接受? 我有一个C++库创建的静态库,想用驱动代码测试这个。

Python 用不同的语言对程序进行单元测试是否可以接受? 我有一个C++库创建的静态库,想用驱动代码测试这个。,python,c++,unit-testing,Python,C++,Unit Testing,我注意到我的一位教授喜欢使用python进行测试,但他只是使用随机测试参数执行程序(本例中不是库,而是可执行文件) 我想采用这种方法,但我意识到这是一个库,没有主功能;这意味着我应该创建一个Driver.cpp类,或者使用SWIG或boostpython将库包装到python中 我计划做后者,因为它看起来更有趣,但从逻辑上讲,我觉得当试图将一个库包装成一种不同的语言只是为了测试它,而不是用它的母语测试它时,会有更多的bug 用另一种语言测试程序在现实世界中是一种公认的做法,还是这种做法不好?我认

我注意到我的一位教授喜欢使用python进行测试,但他只是使用随机测试参数执行程序(本例中不是库,而是可执行文件)

我想采用这种方法,但我意识到这是一个库,没有主功能;这意味着我应该创建一个Driver.cpp类,或者使用SWIG或boostpython将库包装到python中

我计划做后者,因为它看起来更有趣,但从逻辑上讲,我觉得当试图将一个库包装成一种不同的语言只是为了测试它,而不是用它的母语测试它时,会有更多的bug


用另一种语言测试程序在现实世界中是一种公认的做法,还是这种做法不好?

我认为这取决于您实际要测试的内容。对于真正的单元测试,我认为最好使用相同的语言进行测试,或者至少使用二进制兼容的语言进行测试(即使用
Groovy
测试
Java
——在本例中,我使用
Spock
,它基于
Groovy
,对我的
Java
代码进行单元测试,因为我可以将
Java
Groovy
混合使用),但如果您正在测试结果,那么我认为切换语言是公平的

例如,当通过
Python
中的
nose
运行
Perl
应用程序时,当给定一组特定的数据时,我已经测试了预期的结果。这是有效的,因为我不是对Perl代码本身进行单元测试,而是对该Perl代码的结果进行单元测试


在这种情况下,为了单元测试作为应用程序一部分的实际
Perl
函数,我将使用基于
Perl
的测试框架,例如
test::More

为什么不呢?这是一个很棒的想法,因为您确实明白,您正在像黑盒一样测试单元

当然,可能会涉及技术问题,如果您需要模拟被测单元的某些部分,用另一种语言可能会很困难

这是集成测试的一种常见做法,但我见过许多程序是由外部工具驱动的,例如selenium的网站或cucumber的应用程序。这两种程序可以被视为与自定义python脚本相同


如果你认为集成测试和单元测试之间的区别是在任何给定的时间内被测试的事物的数量,你不应该这么做的唯一原因是工具支持。

我会说最好测试一下你的用户会接触到的API。其他测试也很好,但是这是最重要的方面。/p> 如果您的用户打算编写链接到您的库的C/C++代码,那么让测试以同样的方式使用您的库将是一件好事

如果要发布Python包装器(为什么不呢?),那么应该进行Python测试

当然,这也有一个方便的方面,用Python编写测试可能更容易,而且您可能有时间限制,使其更具吸引力,等等

我想我要说的是:使用与被测代码不同的语言进行测试并没有本质上的错误(例如,对于测试REST API来说,这是完全正常的),但请确保至少有面向公众的API的测试


除此之外,关于术语:

我不认为你描述的测试类型是通常意义上的“单元测试”,也许“功能测试”更准确

单元测试通常测试一个非常小的组件(比如函数调用),它可能是一个更大的功能。像这样的单元测试通常是“白盒”测试,因此您可以看到代码的内部工作

从用户的角度进行测试(例如教授的命令行测试)是“黑盒”测试,在这些示例中,测试是在功能级别而不是“单元”级别进行的


我相信很多人可能不同意这一点,尽管-这不是一个严格定义的术语集。

这实际上取决于您试图测试的内容。使用与您正在测试的代码相同的语言编写单元测试几乎总是有意义的,这样您就可以构造被测试的对象或调用被测试的函数,b用同一种语言可以很容易地完成其他工作,并验证它们是否正确工作。但是,在某些情况下,使用不同的语言是有意义的,即:

  • 同时运行多个不同组件或应用程序的集成测试

  • 验证编译或解释失败的测试,这些失败无法在语言本身中测试,因为您正在验证错误是否发生在语言级别

  • #1的一个例子可能是一个程序,它启动相互连接的多个不同的服务器,向服务器发出请求,并验证这些响应。或者,作为一个简单的例子,一个程序,它只是将被测应用程序作为子进程进行分叉,并验证它是否为给定的输入生成预期的输出

    一个例子2可能是一个程序,它验证某一块C++代码会产生静态断言失败,或者如果故意使用某个特定的模板实例化,如果有人试图使用它,将导致编译失败。 为了回答您更大的问题,用不同的语言编写测试本身并不是一个坏的做法。无论是什么使测试编写起来更方便、更容易理解、对实现中的更改更健壮、对回归更敏感,以及更好地利用定义好的测试的任何一个属性,都是一个很好的理由以一种方式编写测试,而不是以另一种方式编写测试