所有分类
  • 所有分类
  • 后端开发
避免单元测试代码重复的策略:提取共用逻辑到父类等

避免单元测试代码重复的策略:提取共用逻辑到父类等

避免单元测试代码重复的策略:使用助手函数提取重复任务,例如检查数组是否存在特定值。单元测试:避免代码重复的实用指南在编写单元测试时,代码重复是一个常见的陷阱。助手函数可以将重复的任务提取到独立的模块中,例如:通过应用这些策略,您可以减少代码

单元测试的时候,老是遇到重复代码,真是烦透了!头都大了,维护起来也麻烦。那今天就来聊聊怎么解决这个问题,希望能帮你把单元测试写得更流畅,看起来也舒服点。

使用助手函数

别揪心,我给你支个招儿!嫌复制黏贴太繁琐呀?别担心,我们可以用小助手来解决这事儿。举个例子,我们有个叫calculateTotal()的函数,要处理一大堆价格数据。为了不让程序老是纠结数组是不是空的问题,我们就可以设置一个小助手。这个助手就是专门负责看看数组里面有没有值,这样在测试的时候就不用再反复检查那么费劲了。这么一来,代码量少了,也更好懂了。

避免单元测试代码重复的策略:提取共用逻辑到父类等

提取共用逻辑到父类

接下来我们就得干点儿正事,如果只是简单地找出一堆测试案例中一样的设置和清理步骤,比如检查数据什么的,那就把这玩意儿整个变成一个子类。这种方法真的很实用,哪儿要改,直接改那个子类就行了,其他类似的也都能跟着变,省事儿多了。而且这样写出来的代码也更整洁,还能提升可维护性!

使用数据提供者

跟大家聊聊数据提供者这玩意儿,是个省事儿的自动化测试神器。比如我们想要验证email()这个函数,检查正确和错误的邮箱地址,数据提供者可以帮咱们提前设定好所有地址,测试时直接自动核对就行了。这样一来,测试代码简单多了,覆盖面也更广了。

避免硬编码

function assertArrayContains($array, $value)
{
    if (!in_array($value, $array)) {
        throw new PHPUnitFrameworkAssertionFailedError('Array does not contain value');
    }
}

老是记不住同一个数字可真让人头疼,搞得代码乱七八糟的。其实,咱们可以考虑用常量或者配置文件把这些重复的数字解决掉。比如说,要是经常碰见某个特殊的错误编码的话,那就把它设成常量呗,无论是测试还是其他地方都能直接拿来用。以后要改错代码就简单多了,只要改动那个常量,所有相关的测试都会跟着变!

重构重复代码

发现好几个地方都有重复的代码?别怕,把它们抽出来整合成新功能,代码简练了,逻辑也更好理解!

class OrderTest extends PHPUnitFrameworkTestCase
{
    public function testCalculateTotal()
    {
        $prices = [];
        // 断言数组不为空的简化方法
        assertArrayContains($prices);
    }
}

使用模板方法模式

模板模式不就是像做菜一样先搭好框架,然后再添调料吗?这设计在单元测试里可是神助攻,只要搞好了框架,那些重复的设置和清理工作都省了,只需要设定一个模板方法,把测试的关键步骤放进去,其他的就让子类去完成。这样既省时间又省力气,还能让代码变得更灵活好用!

使用反射机制

class BaseTestCase extends PHPUnitFrameworkTestCase
{
    public function setUp(): void
    {
        // 设置共同的资源
    }
    public function tearDown(): void
    {
        // 清除共同的资源
    }
}

反射功能简直太神奇了,运行的时候还能随时改变变量值!做单元测试就更省心了,再也不用重复敲那么多代码。比如测试私有方法,直接用反射就能搞定,完全不需要特意提高访问权限,既简单又灵活。

使用依赖注入

举个实际的例子,你想测一个类里的某方法,但这方法得靠其它类,这时你就可以利用依赖注入,直接给这方法送上去,不用你自己再费劲儿搞了,时间也省下来了。而且这么一弄,代码的可测性也提高了不少。

class DatabaseTestCase extends BaseTestCase
{
    protected $connection;
    public function setUp(): void
    {
        // 建立数据库连接
        $this->connection = new PDO(DSN, USER, PASSWORD);
    }
    public function tearDown(): void
    {
        // 关闭数据库连接
        $this->connection = null;
    }
}

使用测试框架的特性

有些测试神器挺好用的,能帮我省好些功夫敲键盘。像PHPUnit里有好多现成的断言能用,特省事,根本不用操心怎么写。而且它还支持数据提供者和依赖注入功能,这样就能避免重复写代码,真的很轻松!

赶快学会这几个小妙招,你的代码就会写得又快又好,单元测试也更容易理解了。希望这些简单方法能帮到你们写单元测试

/**
 * @dataProvider additionProvider
 */
public function testAdd(int $a, int $b, int $expected)
{
    // 测试加法函数
}
public function additionProvider(): array
{
    return [
        [0, 0, 0],
        [1, 1, 2],
        [-1, -1, -2],
    ];
}

原文链接:https://www.icz.com/technicalinformation/web/2024/07/19703.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?