PHPUnit + Xdebug 单元测试技术
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

PHPUnit + Xdebug 单元测试技术

  • 4,237 views
Uploaded on

PHPUnit + Xdebug 单元测试技术推广 Keynote。

PHPUnit + Xdebug 单元测试技术推广 Keynote。

More in: Education , Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
4,237
On Slideshare
3,543
From Embeds
694
Number of Embeds
4

Actions

Shares
Downloads
39
Comments
0
Likes
0

Embeds 694

http://rdc.hoopchina.com 514
http://soplwang.com 167
http://rdc.hupu.com 8
http://cache.baidu.com 5

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. PHPUnit + Xdebug单元测试技术
    ——提升编码质量的工具和方法
  • 2. 讨论的主题
    PHPUnit单元测试技术
    Xdebug调试
  • 3. 声明
    这仅是一个宣传、引导
    会写测试并提升了 工作质量、减少返工次数 的程序员,牧师 老大说了,会更容易得到管理层的奖励和青睐
  • 4. 如何测试…
    测试基础
  • 5. 一个例子: Stack.php
    <?php
    classStack
    {
    private $store;
    publicfunction__construct() {
    $this->store = array();
    }
    publicfunctionpush($o) {
    array_push($this->store, $o);
    }
    publicfunctionpop() {
    returnarray_pop($this->store);
    }
    publicfunctioncount() {
    returncount($this->store);
    }
    }
  • 6. 如何保证正确性?
    手眼测试…
    在程序底部添加一些测试语句
    $stack = new Stack;
    if ($stack) {
    echo $stack->count();
    $stack->push(1111);
    echo $stack->count();
    echo $stack->pop();
    echo $stack->count();
    }
  • 7. 测试成功后…
    剔除/注释 掉这些语句…
  • 8. 下一次再修改时…
    重新加上这些测试语句, 并再次测试
    回归测试
  • 9. 问题是…
    每次修改都要重新加上这些测试, 以验证没有(未预期地) 破坏原有功能…
    好吧, 为何不把测试独立出来呢?
  • 10. 好主意!!
    把测试独立成一个文件, 每次执行一下即可
    无需再做 剔除/注释 – 加上/反注释 工作了
    StackTest.php
    -------------------------------------------------------------------------------------------
    <?php
    require_once ‘./Stack.php’;
    $stack = new Stack;
    if ($stack) {
    echo $stack->count();
    $stack->push(1111);
    echo $stack->count();
    echo $stack->pop();
    echo $stack->count();
    }
  • 11. 新问题是…
    每次都要 手眼测试, 太累了!!!
    呣, 有没有办法让 机器 去做?
    然后自己就有时间去 把妹子…
  • 12. PHPUnit来帮忙
    <?php
    require_once'./Stack.php';
    class StackTestextends PHPUnit_Framework_TestCase
    {
    public function testCanPushAndPop() {
    $stack = new Stack();
    $this->assertEquals(0, $stack->count());
    $stack->push('foo');
    $this->assertEquals(1, $stack->count());
    $this->assertEquals('foo', $stack->pop());
    $this->assertEquals(0, $stack->count());
    }
    }
  • 13. 执行测试
    $ phpunitStackTest
  • 14. 执行测试
    成功时:
  • 15. 执行测试
    失败时:
  • 16. - 互动演示 -
  • 17. Stack 增加新功能时…
    <?php
    classStack
    {
    private $store;
    publicfunction__construct() {
    $this->store = array();
    }
    publicfunctionpush($o) {
    array_push($this->store, $o);
    }
    publicfunctionpop() {
    returnarray_pop($this->store);
    }
    publicfunctioncount() {
    returncount($this->store);
    }
    public function clean() {
    $this->store = array();
    }
    }
  • 18. <?php
    require_once'./Stack.php';
    class StackTestextends PHPUnit_Framework_TestCase
    {
    public function testCanPushAndPop() {
    $stack = new Stack();
    $this->assertEquals(0, $stack->count());
    $stack->push('foo');
    $this->assertEquals(1, $stack->count());
    $this->assertEquals('foo', $stack->pop());
    $this->assertEquals(0, $stack->count());
    }
    public function testCanClean() {
    $stack = new Stack();
    $stack->push('foo');
    $this->assertEquals(1, $stack->count());
    $stack->clean();
    $this->assertEquals(0, $stack->count());
    }
    }
    也要增加新测试…
  • 19. - 互动演示 -
  • 20. xUnit方法的优势
    减少验证 ‘代码正确性’ 的工作量
    自动化回归测试
    避免系统退步
    写测试用例可以促使程序员发现边界条件
    测试用例本身就是很好的示范代码和文档
    写测试用例可以促使程序员真正了解需求
    完备的测试可以给程序员以信心
    More…
  • 21. 什么是测试?
    测试是一组输入、执行条件以及预期结果的集合
    一组断言
    测试是一个产品的详细接口规格
    如何调用,结果值会是如何,etc.
    测试定义产品的每一个面
    测试是…
    这一页 PPT 本身就是个测试…
  • 22. 鸭子
    “When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
    James Whitcomb Riley (1849 – 1916)
    (Duck typing)
  • 23.
    “人就是以为自己不是机器的机器”
    Wang Wenlin (1981 – ∞)
    以为自己不是机器的机器, 是人…
  • 24. 框架中的测试
    Zend Framework & Symfony 1
  • 25. 良好的测试支持
    Zend Framework 集成 PHPUnit支持
    Symfony 1 使用自己的 Lime 测试框架
    Symfony 2 已改用 PHPUnit …
    它们都能自动生成 功能测试 骨架…
  • 26. Zend Framework 示例
    $ zf create project demo
    $ zf create controller foo
    $ phpunit
  • 27. Zend Framework 示例
    <?php
    classIndexControllerTestextendsZend_Test_PHPUnit_ControllerTestCase
    {

    publicfunctiontestIndexAction()
    {
    $params = array('action' => 'index', 'controller' => 'Index', 'module' => 'default');
    $urlParams = $this->urlizeOptions($params);
    $url = $this->url($urlParams);
    $this->dispatch($url);
    // assertions
    $this->assertModule($urlParams['module']);
    $this->assertController($urlParams['controller']);
    $this->assertAction($urlParams['action']);
    $this->assertQueryContentContains("div#welcome h3", "This is your project's main page");
    }
    }
  • 28. - 互动演示 -
  • 29. Symfony示例
    $ symfonygenerate:project demo
    $ symfonygenerate:appfoo
    $ symfonygenerate:modulefoo bar
    $ symfonytest:all
    $ symfonytest:functionalfoo
  • 30. Symfony示例
    <?php
    include(dirname(__FILE__).'/../../bootstrap/functional.php');
    $browser = newsfTestFunctional(new sfBrowser());
    $browser->
    get('/content/index')->
    with('request')->begin()->
    isParameter('module', 'content')->
    isParameter('action', 'index')->
    end()->
    with('response')->begin()->
    isStatusCode(200)->
    checkElement('body', '!/This is a temporary page/')->
    end()
    ;
  • 31. - 互动演示 -
  • 32. 好消息…
    功能测试脚本, 测试组会帮忙制作…
    程序员只需做单元测试
  • 33. PHPUnit还能做什么…
  • 34. 代码覆盖报告
    $ phpunit --coverage-html covStackTest
    代码覆盖报告,一种调试工具。
  • 35.
  • 36. - 互动演示 -
  • 37. 生成规格文档
    $ phpunit --testdoxStackTest
    测试 即是 定义。
  • 38. 生成规格文档
  • 39. - 互动演示 -
  • 40. 测试失败时…
    Xdebug来帮忙
  • 41. Xdebug出场…
    简便的 PHP 调试、跟踪 和 剖析 工具
    我们主要用它的 远程调试功能
  • 42. 如何调试一个测试?
    $ export XDEBUG_CONFIG="remote_host=192.168.8.91idekey=netbeans-xdebug"
    ## plain old php
    $ phpunitStackTest
    ## zend framework
    $ phpunit application/controllers/FooControllerTest
    ## symfony 1
    $ symfonytest:functionalfoo
  • 43. 断点
    单步
    上下文
  • 44. - 互动演示 -
  • 45. Xdebug的其它能力…
    跟踪 (Trace)
    性能剖析 (Profile)
  • 46.
  • 47. 一点疑惑
  • 48. 断言… 可以吗?
    这种定义事物的方式可能并不充分
    但至少是必要的
    可是仍然是不够充分…
    世界上从来没有 ‘完全充分’,就像合同不够充分,法律不会完美一样
    我们的目标是测试案例能覆盖到所有的代码路径即可
  • 49. 测试不是测试组的事吗?
    单元测试 习惯上、实践上 是 程序员写的
    只有程序员自己知道怎么测…
    而且,它也是一种调试工具
    功能测试 习惯上 是 测试组 来做
    但仍然需要程序员的紧密配合
  • 50. 最后…
  • 51. …谢谢!!