我们平时说的单元测试,就是咱们做软件时常会用到的小小测试,用来寻找错误并修复问题的。说到PHP里的单元测试工具,大家最常用的莫过于PHPUnit了,它好用还给我们的代码提供了保障。接下来我就给大家分享一下如何使用这个工具以及它在实战中的用法~
安装PHPUnit
咱儿先把PHPUnit给装上呗!最简单直接的是借助Composer这个牛逼的PHP依赖管理神器。就在你的项目首页键入这行代码,保证能顺利安装到PHPUnit哦:
bash 装个PHPUnit,在require那加个 PHPUnit/phpunit就搞定了。
这个,就是给你的项目安装个phpunit,然后把它添到composer的需求清单里面去。搞定后,用phpunit跑你的项目完全不是事儿了!
编写单元测试
来,咱们这就开始学习如何做单元测试!首先,你要创建一个名叫`Test.php`的测试文件,然后在这个文件里写下测试代码,检验一下你的类和方法运行起来是否正常。
好比我们有个叫`DiscountCalculator`的家伙,就是负责算折扣的那种。现在来试试它行不行。比如说:
“`php
直接用PHPUnit的框架测试套件。
这就是那个测试折扣计算器的小玩意儿——”Discount Calculator Test”!
咱们来试试看这个折扣计算的功能!
新的打折神器来!叫Discount Calculator(折扣计算器),超赞的!
算了一下,答案是$100$。
“别跑题了,咱俩都看好结果是90吗?”
}
}
这次要用到一个叫 `DiscountCalculator` 的类,它里面有个 `calculate` 方法,能给你算了折扣价哟。接着,我们在 PHPUnit 中用了一个 `assertEquals` 函数来测试这个结果,是不是正好等于 90 ?
运行单元测试
唱完儿歌,做个测试,咱们就开始检查代码有啥问题!在命令行里输这几句话就能热身啦:
vendor/bin/phpunit
这个小指令能帮助你跑完项目里所有编排好的测试,还会给你通报哪些顺利过关,哪些不幸失败!听说最后只要大家配合无阻,就能听到我们成功的消息~不过如果遇到某个测试没过关的话,PHPUnit也会帮忙,赶紧告诉你哪块儿出问题了哟。
实战案例:计算折扣
咱们来研究下怎么利用phpunit测试打折计算器,比如说一个叫`DiscountCalculator`的类可以算出商品打折后的价格。
首先,我们定义这个类:
class DiscountCalculator {
这个程序就是用来算钱的呗,就把价格输进去就行。比如说你要算出10块钱是多少,那就在这输入10,程序马上就能告诉你答案!
return $price * 0.9;
接下来,我们编写测试来验证这个类的行为:
测查方法:看看当价钱为0时,优惠计价功能咋样!
简单,把0给计算器算下就得结果了。
composer require --dev phpunit/phpunit
确保结果是 0,就这么办!
咱们今儿个就来瞧瞧这个’DiscountCalculator’究竟咋运作的。别以为它只会计算折扣,其实免费赠送时也能搞定。这么操练下来,不管啥情况都让你安心大胆地用。
处理特殊情况
做测试题时,不只考虑通常情况,特殊情况也要留心。就像商品价格变成负的这种例子,那我们的算法该咋办?多写点题目来应对这些问题!
咱们来测试个功能,那就是负价折扣的计算。
我们新添加了个打折计算器名叫$calculator = new DiscountCalculator()。
哥们儿,帮忙把$-100$输进去计算机,记得存结果到$result$那里。
直接这么做,assertEquals($result, 0);
use PHPUnitFrameworkTestCase; class Test extends TestCase { public function testMethod() { $object = new Object(); $result = $object->method(); $expected = 'Expected result'; $this->assertEquals($expected, $result); } }
其实,这次试验后我发现有时如果价钱变负了,扣款就会自动消失变成0!
使用数据提供器
PHPUnit真的太牛了!有了数据提供器(Data Provider),就能快速完成大量测试案例,比如说我们要测试打折算法,直接调教数据提供器就成。
/**
瞧这儿,这就是我的折扣提供方案!
*/
咱们来做个小游戏!就看你能不能算出打折后的价钱了。规则很简单,就用给出的两个数算就行。比如说,有个函数叫’testCalculateDiscountWithProvider’,我只给你两个数字$price和$expected,你会算吗?
数算机计算的结果就是$结果 = $calculator的’成本'(那个$价格)。
试试看预期结果和实际结果是否吻合。
./vendor/bin/phpunit
看看我们的折扣供应功能!
return [
[100, 90],
[50, 45],
[0, 0],
[-100, 0]
class DiscountCalculator { public function calculateDiscount(float $amount, float $discountPercentage): float { return $amount - ($amount * ($discountPercentage / 100)); } }
];
在这次实验中,我们通过’@dataProvider”来定义一个名为”discountProvider”的数据提供商,这个东东就能生成很多测试案例!然后PHPUnit就会自动运行这些测试,看看有没有问题。
测试覆盖率
最牛批的方式,就是直接用PHPUnit的测试覆盖率功能看看我们写的测试覆盖全不全呗!只要在命令行输这几个词就成了:
安装好PHPUnit,然后把测试结果保存在文件名为”覆盖率”的文件夹里。
这句话呢就是让你制作一份HTML表格,看看每一种类别的软件都经过哪些地方的测试。你们看完这个,就能了解到我们还缺什么代码没测过,然后就可以把测试做得更全面!
总结
use PHPUnitFrameworkTestCase; class DiscountCalculatorTest extends TestCase { public function testCalculateDiscount() { $calculator = new DiscountCalculator(); // 测试 100 元的 20% 折扣 $result = $calculator->calculateDiscount(100, 20); $expected = 80; $this->assertEquals($expected, $result); // 测试 500 元的 10% 折扣 $result = $calculator->calculateDiscount(500, 10); $expected = 450; $this->assertEquals($expected, $result); } }
这篇文章教你如何用 PHPUnit 做单元测试,还有一个实际示例让你看看怎样使用。单元测试就是保证代码质量的秘诀,有问题跑下测试就能及早发现和修复。希望这些内容对你有所帮助,让你更熟练地使用 PHPUnit,同时也让你的代码更加完美!
读者互动
你们有没有试过PHPUnit呀?是用什么方法做单元测试的?快到评论区和我们分享下~分享也是学习!别忘了点赞,也记得转发给你的小伙伴们,让他们也试试看了解PHPUnit!
评论0