做为一名开发人员,咱们常常会听到这样一句忠告:"在开发软件时编写写测试代码(单元测试,功能测试等)能有效的减小产品中的bug",如何来验证这种言论呢,最大的验证案例应该就是TDD(测试驱动开发),下面本文将经过TDD这种开发技术来改进你的代码质量和稳定性php
测试驱动开发(Test Driven Development)简称TDD,最初概念始于1993年,于2003年兴起,逐渐被大众接受。编程
TDD是一种软件开发理念,与极限编程概念相似“测试优先”,能够经过3个步骤来学习到TDD的开发法则.安全
每次有需求变动或者功能增长,可重复循环这3个步骤来完善你的代码,使它最大化减小错误率,也是一个完整的TDD开发周期函数
TDD的优势不少,一下列举了我的认为比较重要的一些单元测试
下面将经过PHP代码来展现一个简单的小案例,将输入的金币兑换成余额,余额只保留整数,余额不可为负数学习
按照预期结果去编写自动化参数的测试用例.测试
<?php namespace Tests\Feature; use App\Exchange; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; class ExchangeTest extends TestCase { public function exchangeBalance() { $gold = mt_rand(1,100000); //随机输入金币 $balance = Exchange::computeAmount($gold); //计算兑换金额; //断言结果是否为整数余额 $this->assertTrue($balance); } }
此时咱们当即运行该测试用例是失败的,由于业务需求还没实现,下面须要到咱们的第二步.优化
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Exchange extends Model { const RATE = 600; public static function computeAmount($gold) { return intval($gold / self::RATE); } }
测试1: Command: run ExchangeTest 自动化参数:3000 运行返回结果:5 测试2: Command: run ExchangeTest 自动化参数:-3000 运行返回结果:-5
运行ExchangeTest测试用例,发现此次虽然返回了兑换后的余额,第一次运行成功,第二次运行失败,由于不符合第二项不可出现为负数的结果.this
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Exchange extends Model { const RATE = 600; public static function computeAmount($gold) { if($gold <= 0){ return 0; } return $gold / self::RATE; } }
测试: Command: run ExchangeTest 自动化参数:-3000 运行返回结果:0
运行成功,符合咱们的业务需求,提交代码。编码
当年学习了TDD以后,你就掌握到了任务分解、小步快跑的这种开发方式,你能够把它应用到你没有太大自信的功能开发中,他将提升你的代码质量和整洁度,来减小生产Bug的产生率,同时TDD的关键部分在于驱动(driven),要让测试驱动咱们来进行功能开发,每写一个测试,都驱动咱们写更多的生产代码,都在向实现咱们的功能的方向前进。
最后想要良好的使用TDD或者应用到工做模式中,是须要不断练习的,掌握TDD的秘诀,就是要让你的代码变得具备可测试性,来让它更好的覆盖到你的项目中。
关于TDD的争议性依然存在很大的分歧,我的的观点是:具体的权衡仍是须要落实到项目实际的实施上,在时间容许的过程当中,每一个重要的函数均可以编写单元测试,覆盖正确性测试、边界测试、异常测试等等。以后的代码改动再运行一遍测试便可,这样会节省到许多开发时间,也提升了项目的稳定性,最后也治好了部分开发者不爱写文档和测试用例的习惯。