Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
单元测试(PHPUnit):为测试创建单独的项目?_Php_Unit Testing_Phpunit - Fatal编程技术网

单元测试(PHPUnit):为测试创建单独的项目?

单元测试(PHPUnit):为测试创建单独的项目?,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,我正在为另一个项目使用的项目编写一些单元测试。我正在测试的项目有一个类,该类将包含仅在其他项目中存在的文件 现在,我如何为这个类编写一个单元测试,而不让它需要包含的文件可用?您是否建议使用存根文件设置一个完整的测试项目该文件是一个包含一些设置并运行所有单元测试的文件?或者我应该使用例如setUp方法创建目录和文件吗 编辑: 更具体地说,我有一个基本项目a,这是一个网站。我有一个项目B,它包含一个生成表单的类。form类将使用Composer安装在项目中。form类将在项目中检查是否存在带有设置文

我正在为另一个项目使用的项目编写一些单元测试。我正在测试的项目有一个类,该类将包含仅在其他项目中存在的文件

现在,我如何为这个类编写一个单元测试,而不让它需要包含的文件可用?您是否建议使用存根文件设置一个完整的测试项目该文件是一个包含一些设置并运行所有单元测试的文件?或者我应该使用例如setUp方法创建目录和文件吗

编辑:


更具体地说,我有一个基本项目a,这是一个网站。我有一个项目B,它包含一个生成表单的类。form类将使用Composer安装在项目中。form类将在项目中检查是否存在带有设置文件的目录。如果它存在,它将包含它并加载其中的设置。为了测试form类,您认为我应该创建一个项目C来测试安装了项目B的项目,并在其中设置了用于测试的设置文件目录吗?或者,您认为使用项目B中的设置文件创建目录更好吗?后者对我来说似乎有点奇怪,因为当我在项目a中安装composer项目B时,我不想在项目a中提供所有这些单元测试材料。

您可以在安装和拆卸过程中创建/删除文件和目录,但请注意,这可能会使您的测试变得松散,因为有时无法删除文件,例如,由于锁定问题或测试失败而未调用拆卸

与本地文件系统交互的一种更安全的方法是,它永远不会真正写入磁盘。该文档包含一个很好的基本示例,用于直接使用文件系统或使用vfstream模拟文件系统访问:

是!!对一切:

现在,我如何为这个类编写一个单元测试,而不让它需要包含的文件可用

您可以创建测试装置。您的代码编程规范是什么?在开发代码时,是否使用测试文件?阅读文档?客户是否给出了规格?您可以创建一个符合规范的输入文件,并将其提供给您的函数

您是否建议使用存根文件设置一个完整的测试项目该文件是一个包含一些设置并运行所有单元测试的文件

是的,但只有绝对最小的测试量才能以编程方式确保交付您所说的为客户机提供的功能!如果函数提供了一个文件路径并对其进行解析,然后加载设置,我觉得至少需要几个测试用例来确保可以从操作系统读取文件。测试加载一个fixture文件来验证文件打开逻辑是否正确应该是一个非常可靠的测试。我认为棘手的部分是尽量减少这些测试的数量

例如,如果需要测试设置解析逻辑,那么创建一个设置文件并让测试加载和解析该设置文件似乎很容易。对于一些测试,这将是非常快速和可靠的。但是,随着测试套件的增长,它变得比内存测试慢几个数量级。您可以通过向设置解析函数提供文件的字符串内容来直接执行设置解析函数,而不是通过文件系统来测试设置解析逻辑。通过这种方式,您可以在内存中、测试函数中构建一个设置字符串,并将其传递到解析函数中,从而避免任何文件系统读取。如果文件太大,需要一个类似文件的对象,以便它可以增量地从文件系统读取数据,那么可以创建一个内存存根对象,您可以使用它

我不确定php api是否适用于此,但如果有类似readline的方法,您可以创建一个伪文件对象,为其提供php文件api,并在测试期间在内存中创建伪设置文件,同时避免使用文件系统

或者我应该使用例如setUp方法创建目录和文件吗


与静态文件相比,这有什么好处?根据我的经验,最小化测试复杂性和测试逻辑对于测试套件的维护和性能来说是巨大的

谢谢你的详细解释!我本可以更具体地说明我正在测试的内容。我用更多的信息更新了我的问题。如果你对你的答案有任何补充,我会很高兴听到。我把我的问题编辑得更具体一些,因为我真的很想知道这个问题,但只有你们两个回答了。如果你有时间的话,你介意对这个问题做最后的评论吗?@minitauros我只是在写另一个答案,但在我意识到这仍然是一个问题之后
古埃。如果你只是想得到一个一般性的回答:在项目B中进行单元测试,并在项目a中进行验收测试,以了解项目a将如何使用它,即带有设置的表单如何运行。要获得更详细的答案,我们实际上需要查看代码,我担心它将不符合最后一部分的回答范围:我同意,我认为它不适合这里的回答范围:。所以你会说只在项目B中包含单元测试,而不关心在项目A中安装单元测试时包含的所有测试。项目B只关心它自己工作。如果项目A中的集成暴露了项目B中的一个缺陷,那么您将添加一个新的单元测试并在项目B中修复它。您无法预测B将集成的所有方式和所有用例,因此为它们进行测试是毫无意义的。公平地说,我来自开源,所以我倾向于在项目之间进行通信,而不是将所有内容都放在一个源代码中。