PHPUnit 单元测试入门笔记

PHPUnit 单元测试入门笔记

为何要进行单元测试?

项目代码常常修改,每每修改一下地方后,其它地方可能相应地也须要做一些修改,但经常被忽视了,从而常常出现各类小 bug,怎样减小这类错误? 一种是使用强类型,能够发现一些简单的错误;另外一个就是使用单元测试,固然返回结果不符合预期时意味着代码可能有 bug .php

单元测试须要作什么?

每一个公共函数或接口的返回值有固定的数据类型与结构,经过判断结果值是否符合预期来排除一些简单的错误。 运行测试时,但愿一条命令运行全部测试代码,多是跨文件甚至是跨目录。 phpunit 是一个可能实现单元测试经常使用须要的工具。html

单元测试以外的测试:

单元测试不能解决全部问题,单元测试主要测试函数的返回值,而具体页面的呈现是否正确,须要模仿浏览器行为来进行测试,好比php-webdriver,chrome拓展程序等都是能够考虑的方法。web

单元测试的覆盖率能不能达到100%?

若是简单粗暴地计算,只要是有测试的函数或方法就是覆盖,那答案是能够。 但每一个函数的全部可能都测试到? 这个应该是不可能的,否则,程序就永远不会出 bug 了。 单元测试的目的是减小 bug ,而没有人能保证程序绝对不会有 bug 。chrome

下载与安装:

  1. 下载各个版本的地址:https://phar.phpunit.de/ 搜索:phpunit-5.

其中php5.6 对应 phpunit5.X 版本bootstrap

phpuint6.X 要求 php7.0以上windows

  1. 在phpunit.phar 同级目录建立一个文件,文件名为:phpunit.bat (windows环境下)

内容为:浏览器

@ php %~dp0phpunit-5.7.9.phar %*

而后把该目录添加到环境变量中,安装完成 运行php7

phpunit -v

测试一下便可app

测试单个文件

hahaTest.php 的基本内容能够这样写:函数

<?php
use PHPUnit\Framework\TestCase;

require("./src/index.php");

class hahaTest extends TestCase{
    //必须是public且方法名是test开头的才会参与测试,protected和private的测试时会提示错误
    public function test_index(){
        $index=new index();//index.php中的类
        $re=$index->haha();
        $this->assertEquals(1,$re);//测试 ./src/index.php 中的index类的haha方法返回值是否是1
    }
}

命令行运行:

phpunit hahaTest.php

测试整个文件夹的方法:

  • 递归读取文件夹下全部的文件命名为 *Test.php,若是文件名不是Test.php结尾的,不会加载到测试
  • 每一个方法必须以test开关,不然会直接跳过
  • 方法的权限必须是 public
  • 运行 phpunit 目录名,便可

phpunit 中依赖 (@depends) 的使用:

  • depends 的使用:
/**  //必须是文档注释,不能自动生成文档注释的要注意一下:第一行必定要两个*号
   * @depends test_haha 提供数据的函数的返回值做为参数 
   */
  public function test_hehe($re){
      //$re 是 test_haha 的返回值,能够在这个方法内使用
  }
  • 最好先建立一个基类:baseTest继承自 TestCase类,文件名为aaTest.php,写aa是保证让它最早被加载,加Test是由于不加的不会被加载运行。 aaTest.php 文件中能够写公共函数,须要公共引进的,一些前置的操做,而后其它测试类继承这个类就能够了

  • 另外一种解决方案: 使用 phpunit.xml 文件,把启动须要的内容写到 base.php 文件,而后在 phpunit 的 bootstrap 属于中引入该文件 执行 phpunit dir 时,若是没有添加 -c phpunit.xml 的话,它会自动在当前目录下查找phpunit.xml或phpunit.xml.dist文件,经过配制文件,能够指定加载顺序 在配置中引入了的文件会优先加载,而后会默认加载*Test.php文件

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="./Index/baseTest.php">
  <testsuites>
    <testsuite name="index">
      <file>./Index/loginTest.php</file> //写了的会优先加载
    </testsuite>
  </testsuites>
</phpunit>

问题

  • 怎样指定测试文件的顺序?

<!-- 使用 phpunit.xml 配置文件,写在testsuite 中的会优先加载,而且按写的顺序加载 -->

  • 跨文件/跨类 怎样使用@depends

<!-- 目前的解决方法:继承须要依赖的类,再重写须要依赖的方法,直接经过parent:: 来调用,这样就可使用 @depends 了 补充:这样会有问题,继承其它测试类,会没被继承的方法重复测试, 经测试后发现,直接使用 类名::方法名 是能够添加到依赖的 -->

  • 怎样知道哪些测试方法被 phpunit 跳过了?

<!-- 运行时,添加 -v 参数,如: phpunit index -v -->

相关文章
相关标签/搜索