我正在为另一个项目使用的项目编写一些单元测试(PHPUnit)。我正在测试的项目有一个类,它将包含仅存在于另一个项目中的文件。
现在如何为这个类编写单元测试,而不需要包含它需要包含的文件?您是否建议使用存根文件设置一个完整的测试项目(有问题的文件是包含一些设置的文件)并在那里运行所有单元测试?或者我应该使用例如setUp()
方法创建目录和文件吗?
编辑:
更具体一点,我有一个基础项目A,这是一个网站。我有一个项目B,它包含一个生成表单的类。表单类将使用Composer安装在项目A中。表单类将在项目A中检查是否存在带有设置文件的目录。如果它存在,它将包含它并加载其中的设置。要测试表单类,您认为我应该创建一个项目C(仅用于测试),它安装项目B并在其中设置包含用于测试的设置文件的目录吗?或者您认为使用项目B本身的设置文件创建目录是一种更好的方法吗?后者对我来说似乎有点奇怪,因为当我在其中编写项目B时,我不希望在项目A中提供所有这些单元测试材料。
答案 0 :(得分:1)
是!!对所有事情:
现在如何为此课程编写单元测试,而不需要包含所需的文件?
您可以创建测试夹具。您的代码编程规范是什么?在开发代码时,您使用的是测试文件吗?阅读文档?根据客户的规格?您可以创建一个满足规范的输入文件并将其提供给您的函数。
您是否建议使用存根文件设置一个完整的测试项目(相关文件是包含某些设置的文件)并在那里运行所有单元测试?
是的,但只有绝对最少量的测试才能以编程方式确保您所说的为您的客户提供的功能正在交付!如果为函数提供了一个文件路径并对其进行解析,然后加载设置,我觉得至少需要有几个测试用例,以确保可以从操作系统中读取文件。有一个测试加载的fixture文件来验证文件打开逻辑是否正确应该是一个非常可靠的测试。我认为棘手的部分是尽量减少这些测试的数量。
例如,如果您需要测试设置解析逻辑,那么创建设置文件并让测试加载并解析该设置文件似乎很容易。对于几个测试,这将是快速和可靠的。但是随着你的测试套件的增长,它变得比内存测试更慢。您可以通过向文件提供文件的字符串内容来直接执行设置解析功能,而不是通过文件系统来测试设置解析逻辑。这样,您可以在内存中,在测试函数中构建设置字符串,并将其传递给解析函数,从而避免任何文件系统读取。如果文件太大并且需要一个类似于对象的文件以便它可以从文件系统中逐步读取数据,则可以创建一个可以使用的内存存根对象。
我不确定php api,但是如果有一个readline方法,你可以创建一个假文件对象,提供PHP文件api并在测试期间在内存中创建假设置文件,同时避免文件系统。
或者我应该使用setUp()方法创建目录和文件?
这比使用静态文件有什么好处?在我的经验中,最小化测试复杂性和测试逻辑对于测试套件维护和性能来说是巨大
答案 1 :(得分:0)
您可以在设置和拆除过程中创建/删除文件和目录,但请注意,这可能会使您的测试失败,因为有时文件无法删除,例如由于锁定问题或测试失败并且没有调用拆除。
与您的本地文件系统进行交互的更安全的方式"是vfsStream,它永远不会写入磁盘。该文档包含一个很好的基本示例,既可以直接使用文件系统,也可以使用vfsStream来模拟文件系统访问:https://github.com/mikey179/vfsStream/wiki/Example