我目前正在尝试使用PHPUnit来了解测试驱动开发(TDD),我对使用TDD编写报告有疑问。
首先:我了解TDD的基本过程:
但我的问题是:你如何使用TDD撰写报告?
假设您的任务是按照颜色,类型和重量编写一份关于通过给定交叉路口的汽车数量的报告。现在,所有上述数据都已在数据库表中捕获,但是要求您将其关联起来。
你如何为一种你不知道结果的方法编写测试?关联此数据的方法的结果将根据日期范围和用户在运行报告时可能提供的其他限制条件进行更改?在这种情况下,如何使用像PHPUnit这样的框架在TDD的范围内工作?
答案 0 :(得分:6)
您事先创建测试数据,表示您将在生产中接收的数据类型,然后根据该数据测试您的代码,每次运行测试时刷新表(即在您的SetUp()函数中)。
无论您正在测试什么,都无法测试您将在生产中收到的实际数据。您只是测试代码是否按预期的方式运行给定方案。例如,如果您使用五行蓝色汽车加载测试表,那么您希望报告在测试时显示五个蓝色汽车。您正在测试报告的各个部分,以便在完成后您将自动测试整个报告。
作为比较,如果你正在测试一个期望1到100之间正整数的函数,你会编写100个测试来测试每个单独的整数吗?不,你会在范围内测试某些东西,然后测试边界上和周围的东西(例如-1,0,1,50,99,100和101)。例如,您不测试55,因为该测试将沿着与50相同的代码路径进行测试。
确定您的代码路径和要求,然后为每个路径和要求创建合适的测试。您的测试将反映您的要求。如果测试通过,那么代码将准确表示您的要求(如果您的要求是错误的,TDD无论如何都无法保存您的要求)。
答案 1 :(得分:2)
运行测试套件和运行脚本时,不要使用相同的数据。您使用测试数据。因此,如果您想与数据库进行交互,一个好的解决方案是创建sqlite database stored in your ram。
同样,如果您的函数与文件系统交互,则可以使用a virtual filesystem。
如果你必须与对象互动,you can mock them too。
好处是您可以使用编写代码时想到的所有恶意边缘案例数据进行测试(嘿,如果数据包含未转义的引号会怎么样?)。
答案 2 :(得分:2)
直接针对您的生产服务器进行测试是非常困难的,而且通常是不明智的,所以最好的办法就是伪造它。
首先,您创建一个stub
,一个代表数据库的特殊对象,允许您让单元测试假装某些值来自数据库,当它真正来自您时。如果需要,你有一些能够产生一些你不了解但仍可通过测试访问的东西。
一旦一切都在那里工作,你可以在一些测试模式中在数据库本身中拥有一个数据集 - 基本上,你连接但使用不同的参数,这样当它认为它正在查看PRODUCTION.CAR_TABLE
它真的看着TESTING.CAR_TABLE
。您甚至可能希望每次都有测试drop / create表(尽管这可能会导致更可靠的测试)。