PHP中的单元测试

Web*_*net 11 php

你们用PHP进行任何单元测试吗?我不确定我是否曾经做过......究竟是什么原因?你能提供一个简单的例子吗?

Alf*_*red 18

单元测试

你们用PHP进行任何单元测试吗?我不确定我是否曾经做过......究竟是什么原因?

单元测试是仅测试一个单元(类)的实践.对于任何好的单元测试,应该允许单独运行(单独运行)并且非常快,否则您可能不会经常运行测试.

集成测试

您还可以编写集成测试来测试整个系统,并且大多数时候执行起来要慢得多.这些测试应该在单元测试后编写!

TDD

在过去,当我使用PHP语言进行更多(频繁)编码时,我根本没有练习TDD(测试驱动开发)(回头看我的代码不是鼻烟).但是现在当我必须在PHP中执行一些代码时,我真的很想测试(单元测试)我的代码.在我看来,你也应该这样做,因为它让你确信代码的质量.

多年来,我用三个简单的规则来描述测试驱动开发.他们是:

  1. 除非要进行失败的单元测试通过,否则不允许编写任何生产代码.
  2. 您不得再编写任何单元测试,而不是足以使其失败; 和编译失败是失败.
  3. 您不能再编写足以通过一个失败单元测试的生产代码.

您必须首先为要编写的功能编写单元测试.但是根据规则2,你不能写很多单元测试.一旦单元测试代码无法编译或断言失败,您必须停止并编写生产代码.但是根据规则3,您只能编写使测试编译或通过的生产代码,而不是更多.

如果你想到这一点,你就会意识到,如果不编译和执行某些东西,你就根本无法编写很多代码.实际上,这确实是重点.在我们所做的每件事中,无论是编写测试,编写生产代码还是重构,我们都会始终保持系统的执行.运行测试之间的时间大约为秒或分钟.即使10分钟也太长了


你能提供一个简单的例子吗?

首先是一个非常简单的例子,让你从phpunit网站开始.

<?php
class StackTest extends PHPUnit_Framework_TestCase
{
    public function testPushAndPop()
    {
        $stack = array();
        $this->assertEquals(0, count($stack));

        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));

        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

作为一个更详细的例子,我想在github上向你指出我的片段.

PHPUnit代码覆盖率

我喜欢使用单元测试框架(在PHP中是phpunit)来练习一种叫做TDD的东西.

我也非常喜欢phpunit,它还通过xdebug 提供代码覆盖.从下图中可以看出,我的班级有100%的测试覆盖率.这意味着我的Authentication班级中的每一行都经过测试,这让我相信代码正在做它应该做的事情.请记住,覆盖并不总是意味着您的代码经过了充分测试.您可以在不测试单行生产代码的情况下获得100%的覆盖率.

Netbeans的

我个人喜欢在Netbeans中测试我的代码(对于PHP).只需单击一下(alt + f6),我就可以测试我的所有代码了.这意味着我不必离开我喜欢的IDE,这可以帮助您节省在会话之间切换的时间.

在此输入图像描述


小智 12

我建议你看看phpunit.手册中还提供了一些简单的例子:http: //www.phpunit.de/manual/3.5/en/writing-tests-for-phpunit.html