永发信息网

php unit怎么测试为质量

答案:1  悬赏:70  手机版
解决时间 2021-02-26 21:52
php unit怎么测试为质量
最佳答案
PHPUnit是一个用PHP编程语言开发的开源软件,是一个单元测试框架。PHPUnit由Sebastian Bergmann创建,源于Kent Beck的SUnit,是xUnit家族的框架之一。本文将探索PHPUnit,特别介绍自动化单元测试的基本用法。你需要掌握PHP编程语言的基本知识才能继续。

介绍

单元测试是对单独的代码对象进行测试的过程,比如对函数、类、方法进行测试。单元测试可以使用任意一段已经写好的测试代码,也可以使用一些已经存在的测试框架,比如JUnit、PHPUnit或者Cantata++,单元测试框架提供了一系列共同、有用的功能来帮助人们编写自动化的检测单元,例如检查一个实际的值是否符合我们期望的值的断言。单元测试框架经常会包含每个测试的报告,以及给出你已经覆盖到的代码覆盖率。

heiing
heiing
翻译于 4年前
5人顶
顶 翻译得不错哦!
安装

PHPUnit 通常以 PEAR 包,Composer bundle 或是 PHAR 文件形式存在。如果你要安装它,你需要先安装 PHP Code Coverage 依赖。在 PEAR 中,你需要天价 phpunit.de 频道,并通过命令行安装两个包:

PHP Unit Testing with PHPUnit
(注意,在输入时,默认的 XAMPP 的 PEAR 安装已经被破坏:你需要在尝试上面代码之前先安装 PEAR PHAR)。

测试一个简单的类

试试只有单一方法的简单类:

class TruthTeller
{
public function() tellTruth
{
return true;
}
}
是的,现在 tellTruth 方法总是返回 TRUE,那么我们应改怎么通过单元测试确保今后它的返回值不变?

K6F
K6F
翻译于 4年前
4人顶
顶 翻译得不错哦!
使用PHPUnit,每组测试是PHPUnit_Framework_TestCase类的一个扩展类,它提供了常用的功能,如判断。下面是一个对上述tellTruth方法的一个基本测试:

require_once 'PHPUnit/Autoload.php';
require_once 'TruthTeller.class.php';
class TruthTester extends PHPUnit_Framework_TestCase
{
function testTruthTeller()
{
$tt = new TruthTeller();
$this->assertTrue($tt->tellTruth());
}
}
请注意,您需要包括PHPUnit的自动加载器和“被测对象”,在这种情况下的TruthTeller类文件。

我们用剩余的代码要做的就是判断,如果tellTruth方法被调用时,它将返回true。这些判断是PHPUnit的核心 - 它们将决定一个测试是通过还是失败。

Holiday_
Holiday_
翻译于 4年前
2人顶
顶 翻译得不错哦!
如果你启动了命令行提示,切换到你的测试所在目录,运行 phpunit TruthTester (参数是你的测试文件名,去除 .php 扩展名),PHPUnit 将会运行文件中指定的所有它能找到的测试(测试将是名字以 test 开头的所有方法)。

PHP Unit Testing with PHPUnit

如果你回到 TruthTeller 类,并将其方法的返回值改为 FALSE,你讲看到类似下面的信息:

PHP Unit Testing with PHPUnit

这就是单元测试的核心——编写断言并判断是否通过。当先前编写并测试通过的代码开始无法通过时,你就知道有更改的代码对现有代码起了负面影响。

在现实中,你肯定需要处理比上一个更复杂的情况。比如一个常见的测试是检查下面的outputArray方法是否返回了一个特定数据结构的数组。

class ArrayTeller
{
public function outputArray()
{
return array(1,2,3);
}
}
对此方法的一个简单测试可以这样写:

class ArrayTester extends PHPUnit_Framework_TestCase
{
function testArrayTeller()
{
$at = new ArrayTeller();
$result = $at->outputArray(1);
$this->assertInternalType("array", $result);
$this->assertCount(3, $result);
$this->assertEquals(1, $result[0]);
$this->assertEquals(3, $result[2]);
}
}
如你所见,使用PHPUnit进行单元测试时可以在每一行进行多样化的检查:可以检查ArrayTeller返回的是否是一个数组,而非任何其他数据类型;可以检查数组的长度;可以检查数组中的单个值。除这些外,还有其它一些功能的断言,比如如果你需要更复杂的判断,假设要知道一个返回值是否处于两个整数的区间内,只要你能用一个IF语句的结果来表述,你就可以用断言assertTrue来测试结果。可点击随后链接来访问PHPUnit官网文档中的所有可用断言列表,。

单元测试片面的讲就是编写覆盖被测方法所有预期行为的测试,最好基于规范文档,不过如果你在编写覆盖现有代码的单元测试,将其视为白盒测试的一种形式更有用。如果你知道一个如下的简单切换方法:

class Switcher
{
public function aOrB($switch, $a, $b)
{
if ($switch == TRUE)
{
return $a;
}
else
{
return $b;
}
}
}
… 你就知道需要编写两个测试,分别针对一种情形。但你开始质疑你是如何知道这些的——如果以后方法变为 True 返回 $a,False 返回 $b,其它情形抛出一个异常,理想情况是规范文档中的某处有提及。无论如何,上面方法的测试如下:

class SwitcherTester extends PHPUnit_Framework_TestCase
{
function testSwitchTrue()
{
$switcher = new Switcher();
$result = $switcher->aOrB(TRUE, 1, 2);
$this->assertEquals(1, $result);
}
function testSwitchFalse()
{
$switcher = new Switcher();
$result = $switcher->aOrB(FALSE, 1, 2);
$this->assertEquals(2, $result);
}
}
运行两个测试同在命令行运行 phpunit SwitcherTester 一样简单。
K6F
使用 setUp,简化多个测试

当你的测试需要覆盖越来越多的输入组合及数据设置时,使用函数: setUp 将会非常有帮助。setUp 是 PHPUnit_Framework_TestCase 类中你可以覆写以在类中所有及每个测试运行前运行的代码。(注意,还有一个简单的方法,tearDown,它会在所有测试结束后立即运行——这对关闭 socket 及文件指针很有帮助)

下面是如何精简代码的一个简单的例子。尝试一个依赖一些对象数据何输入的方法。

class DataTeller
{
private $data;
public function __construct($data)
{
$this->data = $data;
}
public function outputData($switch)
{
if ($switch == TRUE)
{
if (!empty($this->data))
return $this->data;
else
return FALSE;
}
else
{
return "switch off";
}
}
}
如果你继续之前幼稚的方法,我们需要编写三个测试,并实例化三个 DataTeller 对象,每个测试一次。然而,通过 setUp,我们可以讲对 DataTellers对象的创建外包,至少是3个中的两个。只有最后一个测试需要新的 DataTeller 被创建。

class DataTellerTester extends PHPUnit_Framework_TestCase
{
private $dt;
protected $data = "valid data";
function setUp()
{
$this->dt = new DataTeller($this->data);
}
function testOutputArraySwitchOff()
{
$this->assertEquals("switch off", $this->dt->outputData(FALSE));
}
function testOutputArraySwitchOn()
{
$this->assertEquals($this->data, $this->dt->outputData(TRUE));
}
function testOutputArrayEmptySwitchOn()
{
$new_dt = new DataTeller("");
$this->assertEquals(FALSE, $new_dt->outputData(TRUE));
}
}

PHPUnit使用断言来告诉你你所测试的代码是否如你预期那样工作。学到这里,你现在应该已经可以写一些简单的测试来覆盖一些功能相对比较独立的类了。但当要测试一些互相有交互操作的类时,就要面对真正的挑战了。为此,请收听下一次讲解,学习如何为静态类写测试,以及如何使用 mock(模拟对象)和 stubs(存根,桩点)来孤立你要测试的对象与其所在环境中其他代码的联系。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
劳动仲裁赢了,但公司不给钱怎么办
某户原来种植的花生某农户种植花生,原来种植
诗晶我想知道这个在什么地方
平顺县西沟乡下井村民委员会怎么去啊,有知道
那啥.16版13寸pro和17版13寸pro的区别纠结
手机掉了微信怎么冻结
手机的电池怎么降压为1.5v呢?用什么电阻或者
具有降逆化痰,益气和胃功用的方剂是A.苏子降
帐房壕怎么去啊,有知道地址的么
德记陶瓷茶具地址在哪,我要去那里办事
西安小寨有个文汇商厦,里面有,卖电玩的,文
我的高考成绩是529,该报什么学校好
素美人の甜品工房(大悦城店)地址有知道的么?
驯龙高手主人公小嗝嗝有什么特点
东北人说的装是啥意思?
推荐资讯
大连装宽带哪家好?
2019年南方新课堂金牌学案六年级英语上册粤人
用泡好的椰砖养多肉可以吗?
腾飞百货在哪里啊,我有事要去这个地方
鹿寨县公安局城北派出所怎么去啊,有知道地址
中国宁夏盐池滩羊美食文化(苏州)研究基地怎么
胆囊结石痛怎么缓解
金河田战龙rx590 机箱电源怎么样
童年记忆里那经典的歌曲推荐几首吧
真核生物进行有性生殖时要进行减数分裂和受精
儒家思想长期以来作为我国正统的意识形态,对
郭敬明跟村上春树比较
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?