PHPUNIT测试

1. PHPUNIT是什么

PHPUnit是一个用PHP编程语言开发的开源软件,是一个单元测试框架。

1.1 为什么要用PHPUNIT

  1. 用phpunit是一个不错的主意
  2. 更改代码不会破坏他原有的结构 - 我们不需要修改源码。。
  3. 帮助其他开发人员了解您的代码的作用(并帮助入职过程,新人等等。。)
  4. 帮助您在编写代码时保持检查。 它会迫使你思考一些事情,例如“我将如何测试这个?
  5. 帮助你在晚上能睡好觉。。。。

1.2 单元测试的概念

程序单元是应用的最小可测试部件。 在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

2. 开始学习

Getting Started With PHPUnit: http://phpunit.de/

安装

  • 旧方法:PEAR
  • 新方法:PHAR or Composer

http://phpunit.de/manual/current/en/installation.html

案例1

The Code:

1
2
3
4
5
6
7
8
9
10
11
class Unicorns {
private $count = 8;
public function getCount() {
return $this->count;
}
public function steal($number) {
$this->count -= $number;
}
}

The Unit Test

1
2
3
4
5
6
7
8
9
10
11
12
class UnicornsTest extends PHPUnit_Framework_TestCase {
public function test_can_steal() {
// Setup
$unicorns = Unicorns();
// Action
$unicorns->steal(5);
// Assert
$this->assertEquals(3, $unicorns->getCount());
}
}

Running PHPUnit

1
$ phpunit tests/unicorns.php
PHPUnit 3.4.0 by Sebastian Bergmann.
Time: 0 seconds, Memory: 0.5Mb
OK (1 tests, 1 assertions)

案例2

The “Optimizer”

1
2
3
4
5
6
7
8
9
10
11
class Unicorns() {
private $count = 8;
public function getCount() {
return $this->count;
}
public function steal($number) {
$this->count -= $this->count - $number >= 0 ? $number : 0;
}
}

OUR TEST:

1
2
3
4
5
6
7
8
9
10
11
12
13
class UnicornsTest extends PHPUnit_Framework_TestCase() {
public function test_can_steal() {
$unicorns = Unicorns();
$unicorns->steal(5);
$this->assertEquals(3, $unicorns->getCount());
}
public function test_cant_steal() {
$unicorns = Unicorns();
$unicorns->steal(1000);
$this->assertEquals(8, $unicorns->getCount());
}
}

Running PHPUnit

1
2
3
4
5
PHPUnit 3.4.0 by Sebastian Bergmann.
..
Time: 0 seconds, Memory: 0.5Mb
OK (2 tests, 2 assertions)

案例3

The Bad “Optimizer”

1
2
3
4
5
6
7
8
9
10
11
12
class Unicorns() {
private $count = 8;
public function getCount() {
return $this->count;
}
public function steal($num) {
$this->count -= $this->count - $num >= 0 ? $num : $this->count;
}
}

Running PHPUnit (again):

1
phpunit tests/unicorns.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PHPUnit 3.4.0 by Sebastian Bergmann.
Time: 0 seconds, Memory: 0.5Mb
There was 1 failure:
1) UnicornsTest::test\_cant\_steal
Failed asserting that 0 matches expected 8.
/path/to/test/unicorns.php:11
FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

3. 配置项

  • assertEquals()
  • assertTrue()
  • assertFalse()
  • assertLessThan()
  • assertNull()
  • assertRegExp()

http://phpunit.de/manual/current/en/appendixes.assertions.html

4. FizzBuzz

FizzBuzz是借鉴一个英国学校里小孩子经常玩的游戏。改编后的题目大概是这样的 “编写程序把1-100的数字打印出来。不过,要把3的倍数打成"Fizz",把5的倍数打成"Buzz"。而如果一个数既是3的倍数。又是5的倍数时,就打成"Fizz-Buzz",其余的输出数字。然后在论坛看见这道编程题很多计算级系的高材生(博士、硕士之类的)都不能现场写出来,更有多年经验自称高级开发程序员在几分钟内也写不出来

不过既然说到这了,那就先打开来考验下自己,最后我是通过两种方式来实现的:
第一种:利用循环和条件判断,过滤满足特定条件的数字,然后输出结果,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for ($i = 1; $i <= 100; $i++)
{
if($i % 3 == 0 && $i % 5 ==0){
echo "FizzBuzz<br />\n";
}
else if($i % 3 == 0){
echo "Fizz<br />\n";
}
else if($i % 5 == 0){
echo "Buzz<br />\n";
}
else {
echo $i."<br />\n";
}
}
1
2
3
4
5
6
7
8
// 或者更加简单
for ($i = 1; $i <= 100; $i++) {
$mod3 = $i % 3;
$mod5 = $i % 5;
echo (!$mod3 && !$mod5 ? "FizzBuzz" : (!$mod3 ? "Fizz" : (!$mod5 ? "Buzz" : $i))) ."<br>\n";
}

Alt text

5. 扩展

DOCUMENT