在我们的开发团队中,我们决定尝试单元测试。我们使用Simpletest。然而,这是一条艰难的道路。一周后,我只创建了一个测试某个帮助文件的单元测试。而已。其余的(控制器,模型,视图,库)还没有单元测试。我打算不测试其中的大多数。例如,视图太难以测试,所以我放弃测试。接下来,控制器。我计划我的控制器不做复杂的事情,所以它只在模型和视图之间传递信息。我会把那些更复杂的东西移到图书馆或帮手那里。
现在提出我的问题:
1)我做错了吗?到目前为止,我没有看到任何可能错误的内容,因此需要进行单元测试。大多数东西(现在)只是CRUD。
2)我们真的需要单元测试控制器吗?由于控制器的工作只是对View和Model之间传递的数据进行微小处理,因此我发现单元测试的主动性很小。
3)如果我使用WebTestCase来测试控制器,那么它仍然被认为是单元测试吗?或者它已经是集成测试?
4)假设你让我测试我的控制器,我该如何测试它?据我所知,CI通过index.php遵循Front Controller模式,那么我将如何处理(mock?)?
答案 0 :(得分:4)
如果您仍然对CodeIgniter的其他单元测试提出建议,我建议您尝试Toast。我发现它易于使用,并且不会干扰我的开发过程。
我只使用单元测试来测试我的库,帮助器和模型。我的控制器没有太多代码,只有post和uri参数,使用trim或intval清理它,将它传递给库或模型,然后将结果传递给view。
查看几乎没有要测试的代码,因为它向浏览器显示所有内容。大多数情况下,它只需要css和js调试。
模型几乎总是需要测试,因为它处理数据。没有单元测试,我发现很难找到一些bug,特别是复杂的计算。
库和帮助程序执行重复性任务,因此需要进行单元测试以确保其中的逻辑正常工作。
我希望这有帮助。
答案 1 :(得分:3)
你做错了吗?我不这么认为。
我们真的需要单元测试控制器吗?我不。也许我应该。看起来好像很多工作。
如果我使用WebTestCase测试控制器,那么它仍然被认为是单元测试吗?或者它已经是集成测试?如果可以检测到一些有意义的输出,WebTestCase将是一种测试控制器的有趣方法;例如,在调用/ some / specific / path时检测到没有发生错误。
假设您让我测试我的控制器,我该如何测试它?这是一个艰难的。您可能需要初始化部分应用程序环境,以便做任何有价值的事情。
大多数文章/书籍都会告诉您在开始编码之前定义测试。也许我已经尝试过,但我通常太不耐烦了。它似乎妨碍了快速原型设计,但可能定义单元测试 是一种快速原型设计方式。
我发现决定用PHP测试什么是一个挑战。我想你必须选择你的战斗。如果方法返回特定类型的值至关重要,那么测试它。如果在实例化对象时自动发生很多事情,您也可以测试它。
一般来说,我所做的 - 对或错 - 是让一切正常,然后创建一些基本测试,然后根据我遇到的任何问题根据需要添加测试。我们的想法是永远不会出现重复问题,每项测试都会确保应用程序在其生命周期中的行为相同。
至于细节,我使用的是Zend Framework,但它在CodeIgniter中类似。我也使用SimpleTest(但使用我自己的类包装器)。我可能会或可能不会对模型进行单元测试,但我从未对控制器或视图进行过测试;这似乎太多的工作和太少的好处。大多数框架“早期失败”,因此问题通常很明显。但是任何常见的库代码都会使更容易的目标和错误 - 特别是逻辑错误 - 更难以检测。设置测试以确保按预期工作,以便特定于框架的代码遇到很少的问题。