Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PHPUnit测试问题-如何对我的类进行单元测试

PHPUnit测试问题-如何对我的类进行单元测试
EN

Stack Overflow用户
提问于 2010-01-20 07:51:51
回答 3查看 2.8K关注 0票数 13

我试图进入单元测试,因为它引入了一些明显的优点,我还试图为我前几天编写的一个类编写一个单元测试。(我知道这与TDD正好相反,请容忍我)

我的类Image与其他类一起用于图像处理。

Image本质上封装了GD图像资源并存储数据。例如,Image的实例将始终包含它的当前状态,即如果调整大小,它的新宽度/高度、原始图像数据等等。

Image类还包含

  • 从文件、字符串数据或URL创建自身,例如$image->loadFromPath()
  • 从当前Image实例的属性创建新的GD图像资源,例如用于图像调整以保持背景透明度等。
  • 克隆GD图像资源以用于操作类

我正在苦苦挣扎的是如何用PHPUnit正确地测试这个类。我读过一些书,对于如何处理它,我有一些相互矛盾的想法,但我不知道什么是正确的。我有,

  1. 为类的每个方法编写一个测试。我在某个地方读到,我应该测试每一种方法。但是,有些方法运行其他方法(我可以添加),因此您有一个依赖链。但我也读到,每个单元测试都应该是独立的。如果是这样,我该怎么办?
  2. 编写每个测试作为类的使用路径。我还在某个地方读到,每个测试应该代表一个您可以与类一起使用的路径/使用路径。因此,如果涵盖每一种用法,最终将获得完整的代码覆盖率。

那么,哪一个是正确的,如果有的话?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-20 08:54:19

应该编写单元测试来评估类的公共接口。您的测试用例应该像您希望在程序中使用的那样使用这个类。这里的想法是测试类的行为(可能是预期的、意外的或边缘条件)。

你发表的两个观点都是正确的。理论上,您应该有足够的测试用例(通过代码进行路由),使类中的所有方法都能运行。

如前所述,100%的测试覆盖率是一个不错的目标,但并不总是现实的。

另外,在GD的情况下,在编写测试GD功能的单元测试时要小心(它已经过测试,您不需要浪费时间再次测试它)。我将在读懂手册中使用PHPUnit的模拟和存根(以及对文件系统的模拟)。

下面是示例测试的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function testImageIsResized()
{
    $image = new Image();
    $image->loadFromPath('some/path');
    $image->resize(200, 300);
    $this->assertEquals(200, $image->getWidth());
    $this->assertEquals(300, $image->getHeight());
}

现在,取决于图像类的预期行为,这个测试可能通过而没有问题,或者它可能会失败,因为它期望新的维度按比例被约束到原始的图像维度。但是,我们没有显式地调用检查测试本身中该约束的内部方法。

票数 9
EN

Stack Overflow用户

发布于 2010-01-20 08:15:11

您可以使用注解指定测试是否包括多个方法。因此,如果您的方法之一调用另一个方法,您可以简单地将注释添加到测试的docblock中,并将其添加到代码覆盖率统计信息中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @test
 * @covers MyClass::something()
 * @covers MyClass::_somethingElse()
 */
public function somethingWorksAsExpected()
{
    $this->assertSame($expected, $this->testObject->something());
}

对于个人项目,100%的代码覆盖范围很好。然而,我在会议上看到了100%的怀疑是必要的。尽管有所有的好处,但是测试需要时间来编写,而在一个预算项目中,只测试80/20就足够了,而忽略了应用程序不重要的低优先级特性。

至于如何测试您的类,请看一看关于PHPUnit手册中的行为驱动开发的章节。在您的情况下,我将测试您在问题中描述的功能。

票数 5
EN

Stack Overflow用户

发布于 2011-05-25 17:45:40

斯蒂芬·梅罗斯说:

但是,有些方法运行其他方法(我可以添加),因此您有一个依赖链。但我也读到每个单元测试应该独立于另一个单元测试

测试独立性不在于不对同一代码进行两次测试,而是一个测试的结果(或缺少结果)是否会影响另一个测试的结果。如果第一个测试插入了一些数据,然后在数据删除之前失败,那么第二个测试的结果可能与预期不同。理想情况下,您应该能够以随机顺序运行您的测试,或者运行一些而不是其他。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2102690

复制
相关文章
如何对类中的protected方法进行单元测试
也许很多同学写单元测试时遇到这样的问题,一个类方法是 protected ,如何测呢 ? 当然,你可以说把 protected 改成 public 就可测了!没错,是可测了,可是 ......
跑马溜溜的球
2020/12/07
4K0
python如何对类进行测试
下面介绍针对类的测试,很多程序中都会用到类,因此能够证明你的类能够正确地工作会大有裨益。如果针对类的测试通过了,你就能确信对类所做的改进没有意外地破坏其原有的行为。
狼啸风云
2019/03/19
4.4K0
phpunit-单元测试神器
在我们开发的时候,测试是必不可少的东西,那么有个好的测试工具才能让你测试的效率提升,现在就介绍下最近我发现的单元测试工具-phpunit吧.
仙士可
2019/12/19
1.6K0
phpunit-单元测试神器
laravel之phpunit单元测试
PHPUnit 是一个用PHP编程语言开发的开源软件,是一个单元测试框架。PHPUnit由Sebastian Bergmann创建,源于Kent Beck的SUnit,是xUnit家族的框架之一。PHPUnit中国官网
全栈程序员站长
2022/08/09
1.8K0
laravel之phpunit单元测试
如何对机器学习代码进行单元测试?
本文介绍了一种用于机器学习代码的单元测试方法,通过生成数据输入、模型推理、损失计算和优化等步骤,来确保每个组件只在一个步骤中起作用。作者还提供了相应的测试用例和代码示例,以帮助读者更好地理解单元测试的实现过程。同时,作者也提醒读者,单元测试并非万能的,需要结合其他测试方法来全面评估机器学习代码的性能和正确性。
企鹅号小编
2018/01/09
2.5K0
如何对机器学习代码进行单元测试?
如何对 Jenkins 共享库进行单元测试
Jenkins 共享库是除了 Jenkins 插件外,另一种扩展 Jenkins 流水线的技术。通过它,可以轻松地自定义步骤,还可以对现有的流水线逻辑进行一定程度的抽象与封装。至于如何写及如何使用它,读者朋友可以移步附录中的官方文档。
LinuxSuRen
2019/05/29
2.2K0
如何对Spring MVC中的Controller进行单元测试
对Controller进行单元测试是Spring框架原生就支持的能力,它可以模拟HTTP客户端发起对服务地址的请求,可以不用借助于诸如Postman这样的外部工具就能完成对接口的测试。 具体来讲,是由Spring框架中的spring-test模块提供的实现,详见MockMvc。
编程随笔
2022/04/29
2.3K0
如何对类中的private方法进行测试?
问题:如何对类中的private方法进行测试? 大多数时候,private都是给public方法调用的,其实只要测试public即可。但是有时由于逻辑复杂等原因,一个public方法可能包含了多个private方法,再加上各种if/else,直接测public又要覆盖其中每个private方法的N多情况还是比较麻烦的,这时候应该考虑单对其中的private方法时行测试了。那么如何进行呢?
跑马溜溜的球
2020/12/07
3.5K0
对 React 组件进行单元测试
前端开发的一个特点是更多的会涉及用户界面,当开发规模达到一定程度时,几乎注定了其复杂度会成倍的增长。
江米小枣
2020/06/16
4.3K0
如何在单元测试中对写数据库进行测试?
转账是银行等金融系统中常见的一个场景。在在最近的一个针对转账服务的单元测试中,笔者就遇到了上述问题。一个极端简化的转账申请如下图:
Antony
2020/12/01
3.8K0
如何在单元测试中对写数据库进行测试?
[译] 对 Vue-Router 进行单元测试
原文:https://medium.com/js-dojo/unit-testing-vue-router-1d091241312
江米小枣
2020/06/15
2.2K0
我对单元测试和测试驱动开发的见解
(废话想说一些:如果我们听到一个陌生的概念,不去追问它是什么,它有什么用?直接进行任务去完成这个概念描述的事,那么,我们可能很难理解我们为什么要这么做,也可能做不好。)
顾翔
2019/12/12
8210
单元测试套件PHPUnit_Framework_TestSuite的用法
二.TestSuite的两种用法 在写用法之前,先做点准备工作。 demo.php
跑马溜溜的球
2020/12/07
6420
点击加载更多

相似问题

如何使用PHPUnit对异常进行单元测试?

20

如何使用phpunit对无效参数进行单元测试?

20

我如何对这个类进行单元测试?

33

用PHPUnit对Doctrine对象进行单元测试

20

用PHPUnit对Laravel 4进行单元测试

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文