phpunit PHP单元测试的利器

简介: PHPUnit是PHP的单元测试框架。单元测试在软件开发中越来越受到重视,测试先行编程、极限编程和测试驱动开发在实践中被广泛。利用单元测试,也可以实现契约式设计。

PHPUnit是PHP的单元测试框架。单元测试在软件开发中越来越受到重视,测试先行编程、极限编程和测试驱动开发在实践中被广泛。利用单元测试,也可以实现契约式设计。

image.png

接下来,我们通过一个例子说明如何利用PHPUnit来实践测试驱动开发。

假设我们需要编写一个银行账户的功能:BankAccount。该功能用于设置银行账户收支,存取现金,必须确保:

  • 银行账户初始化时余额为0。
  • 余额不能为负数。

在编写代码之前,我们先为BankAccout类编写测试:

require_once'BankAccount.php';

classBankAccountTestextendsPHPUnit_Framework_TestCase

{

   protected$ba;

   protectedfunctionsetUp()

   {

       $this->ba = new BankAccount;

   }

   publicfunctiontestBalanceIsInitiallyZero()

   {

       $this->assertEquals(0, $this->ba->getBalance());

   }

   publicfunctiontestBalanceCannotBecomeNegative()

   {

       try {

           $this->ba->withdrawMoney(1);

       }

       catch (BankAccountException $e) {

           $this->assertEquals(0, $this->ba->getBalance());

           return;

       }

       $this->fail();

   }

   publicfunctiontestBalanceCannotBecomeNegative2()

   {

       try {

           $this->ba->depositMoney(-1);

       }

       catch (BankAccountException $e) {

           $this->assertEquals(0, $this->ba->getBalance());

           return;

       }

       $this->fail();

   }

}

现在我们编写为了让第一个测试testBalanceIsInitiallyZero()通过所需要的代码:

classBankAccount

{

   protected$balance = 0;

   publicfunctiongetBalance()

   {

       return$this->balance;

   }

}

现在第一个测试可以通过了,第二个还不行:

phpunit BankAccountTest

PHPUnit 3.7.0by Sebastian Bergmann.

.

Fatal error: Call to undefined methodBankAccount::withdrawMoney()

为了让第二个测试通过,我们需要实现withdrawMoney()depositMoney()setBalance()方法。这些方法在违反约束条件时,会抛出一个BankAccountException

classBankAccount

{

   protected$balance = 0;

   publicfunctiongetBalance()

   {

       return$this->balance;

   }

   protectedfunctionsetBalance($balance)

   {

       if ($balance >= 0) {

           $this->balance = $balance;

       } else {

           thrownew BankAccountException;

       }

   }

   publicfunctiondepositMoney($balance)

   {

       $this->setBalance($this->getBalance() + $balance);

       return$this->getBalance();

   }

   publicfunctionwithdrawMoney($balance)

   {

       $this->setBalance($this->getBalance() - $balance);

       return$this->getBalance();

   }

}

现在第二个测试也能通过啦~

phpunit BankAccountTest

PHPUnit 3.7.0 by Sebastian Bergmann.

...

Time: 0 seconds

OK (3 tests, 3 assertions)

你也可以使用契约式设计的风格,只需使用PHPUnit_Framework_Assert类提供的静态断言方法编写契约条件。下面例子中,如果断言不成立,就会抛出一个PHPUnit_Framework_AssertionFailedError。这种方式可以增加你的代码的可读性。但是这也意味着你需要PHPUnit会成为你的运行时依赖。

classBankAccount

{

   private$balance = 0;

   publicfunctiongetBalance()

   {

       return$this->balance;

   }

   protectedfunctionsetBalance($balance)

   {

       PHPUnit_Framework_Assert::assertTrue($balance >= 0);

       $this->balance = $balance;

   }

   publicfunctiondepositMoney($amount)

   {

       PHPUnit_Framework_Assert::assertTrue($amount >= 0);

       $this->setBalance($this->getBalance() + $amount);

       return$this->getBalance();

   }

   publicfunctionwithdrawMoney($amount)

   {

       PHPUnit_Framework_Assert::assertTrue($amount >= 0);

       PHPUnit_Framework_Assert::assertTrue($this->balance >= $amount);

       $this->setBalance($this->getBalance() - $amount);

       return$this->getBalance();

   }

}


相关文章
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
|
11天前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
|
17天前
|
设计模式 人工智能 算法
PHP中的设计模式:策略模式的深入解析与实践软件测试中的人工智能革命:提升效率与准确性的新篇章
在PHP开发中,理解并运用设计模式是提升代码质量和可维护性的重要途径。本文聚焦于策略模式(Strategy Pattern),一种行为型设计模式,它允许在运行时选择算法或业务规则。通过本文,我们将深入探讨策略模式的定义、结构、使用场景以及如何在PHP项目中有效地实现和利用策略模式。不同于性能优化等技术性摘要,本文着重于提供对策略模式全面而实用的理解,助力开发者编写出更加灵活和可扩展的应用程序。 本文深入探讨了人工智能在软件测试领域的应用,揭示了其如何显著提高测试过程的效率和准确性。通过实际案例分析,展示了AI技术在自动化测试、缺陷检测及结果分析中的关键作用,并讨论了实施AI测试策略时面临的挑
17 3
|
3月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
31 4
|
3月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
19 1
|
3月前
|
数据库
基于PHP+MYSQL开发制作的趣味测试网站源码
基于PHP+MYSQL开发制作的趣味测试网站源码。可在后台提前设置好缘分, 自己手动在数据库里修改数据,数据库里有就会优先查询数据库的信息, 没设置的话第一次查询缘分都是非常好的 95-99,第二次查就比较差 , 所以如果要你女朋友查询你的名字觉得很好 那就得是她第一反应是查和你的缘分, 如果查的是别人,那不好意思,第二个可能是你。
53 3
|
3月前
|
测试技术 PHP 开发者
原生php单元测试示例
通过上面的示例,我们可以看到,即使在缺乏专门测试框架的情况下,使用原生PHP代码进行基本的单元测试也是完全可行的。当然,对于更复杂的项目,利用像PHPUnit这样的专业工具将带来更多的便利和高级功能。不过,理解单元测试的基本概念和能够手工编写测试是每个PHP开发者的宝贵技能。
18 0
|
PHP 数据库
对PHP源码的测试
对PHP源码的测试
|
JSON 监控 前端开发
Zabbix监控系统PHP-API开发测试实录
Zabbix监控系统PHP-API开发测试实录
225 0
下一篇
无影云桌面