我目前正在开发一个简单的PHP框架来管理和调度ajax调用。它的一个功能是它会根据后端发生的情况自动发送相应的标头。在过去的几天里,我开始为PHPUnit编写了很多单元测试,我正试图获得一个不错的code coverage。 (是的,我知道,高代码覆盖本身并不意味着什么。但它仍然是一个很好的指标。)
但是,因为(据我所知)当PHP处于CLI模式时,不可能发送/检查标头,所以需要通过本地Web服务器运行许多测试。这使我可以轻松检查标题和响应正文。不幸的是,在这些测试中执行的代码自然不会被PHPUnit跟踪。 (只是要明确:本地检查的每一段代码都在本地检查。但是与标题相关的所有内容都不属于该类别。)
我知道我可以封装header()
调用并在测试期间用模拟对象替换它。然而,那时我必须重新实现标头替换的整个逻辑,而不是所有潜在的怪癖和错误,所以我基本上测试我自己的header()
- 实现而不是真正发生的事情 - 这正是我不想要做的事情。
所以我想我的问题是这样的:我可以在某种程度上在我的代码覆盖率报告中包含那些“远程调用”吗?或者我(这是我的猜测)只是必须接受这样一个事实:我要错过100%的代码覆盖率才能在真实条件下进行测试?
答案 0 :(得分:0)
嗯,在实践中,几乎不可能获得整个代码库的100%覆盖率。你真正想要的地方100%是应用程序的核心(库和重用组件)。其余部分非常适合测试,但是如果你发现有些情况会使测试变得非常困难,那么不要强调自己在几行不可测试的代码上。
就你的具体问题而言,我甚至不会为这类事情编写单元测试。我要写的是使用Selenium HQ的UI测试。它仍然是完全自动化的,并且在PHPUnit中运行,但它使用一个或多个浏览器。它实际上更多的是集成或验收测试,而不是单元测试,但它运作良好......
答案 1 :(得分:0)
显然,没有办法做到这一点。
虽然ircmaxell的答案很有趣,但它并没有真正回答我的问题(因此我将此答案标记为已接受)。