RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 762204
Accepted
sanmai
sanmai
Asked:2020-12-23 09:32:10 +0000 UTC2020-12-23 09:32:10 +0000 UTC 2020-12-23 09:32:10 +0000 UTC

如何找到缓慢的 PHPUnit 测试?

  • 772

测试需要很长时间才能运行。例如,有一个 PHPUnit 工作的结果:

Time: 669.95 seconds, Memory: 34.00MB

OK, but incomplete, skipped, or risky tests!
Tests: 4990, Assertions: 18999, Skipped: 218.

你怎么知道时间都去哪儿了?哪些测试耗时最长?

是否可以在不安装和使用第三方实用程序的情况下获取此类信息?理想情况下,应该在测试执行之后或执行期间立即显示长测试信息,如果数据以编程方式可用则更好。越简单越好。

启动 PHPUnit 的键没有类似的东西。

php
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Мелкий
    2020-12-25T17:49:52Z2020-12-25T17:49:52Z

    在文档中,phpunit您可以立即找到两个可供选择的常规选项:

    XML 日志

    启用日志记录,例如,可以选择--log-junit log.xml将日志写入 XML,包括每个测试的执行时间。文档的结构很简单,添加任何进一步的处理应该不是问题。文档中的示例日志:

    <?xml version="1.0" encoding="UTF-8"?>
    <testsuites>
      <testsuite name="ArrayTest"
                 file="/home/sb/ArrayTest.php"
                 tests="2"
                 assertions="2"
                 failures="0"
                 errors="0"
                 time="0.016030">
        <testcase name="testNewArrayIsEmpty"
                  class="ArrayTest"
                  file="/home/sb/ArrayTest.php"
                  line="6"
                  assertions="1"
                  time="0.008044"/>
        <testcase name="testArrayContainsAnElement"
                  class="ArrayTest"
                  file="/home/sb/ArrayTest.php"
                  line="15"
                  assertions="1"
                  time="0.007986"/>
      </testsuite>
    </testsuites>
    

    属性time- 以秒为单位的执行时间。

    顺便说一句,检查您的CI日志本身是否可以理解这个日志本身,或者它是否理解附近的格式,--log-teamcity或者--testdox-xml- 那里也有一个运行时。

    为事件添加监听器

    事件startTest是endTest为自己提供的。一般来说,一个endTest就足够了,作为第二个参数,测试执行时间已经以完成的形式传递了。

    <?php
    
    use PHPUnit\Framework\BaseTestListener;
    
    class SimpleTestListener extends BaseTestListener
    {
        public function endTest(PHPUnit_Framework_Test $test, $time)
        {
            echo 'Test ', $test->getName(), ' completed in ', $time, ' sec', PHP_EOL;
        }
    }
    

    并在 config 中注册phpunit:

    <phpunit
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.3/phpunit.xsd">
      <listeners>
        <listener class="SimpleTestListener" file="/some/path/to/SimpleTestListener.php">
        </listener>
      </listeners>
    </phpunit>
    

    剩下的只是决定listener从中输出什么以及在哪里输出。更多选项可以做任何事情,但phpunit在调用后添加一点 xml 阅读器可能会更快更容易。

    • 1
  2. etki
    2020-12-27T17:12:05Z2020-12-27T17:12:05Z

    我建议使用Allure 框架——一个用于生成开箱即用的测试报告的特殊框架,它已经包含 90% 以上的实际构建测试报告的必要功能(包括测试的分类、它们的优先级、相关指示)任务跟踪器中的错误测试、任意附件、单个步骤的记录等),包括有关测试执行时间的简单图表:

    在此处输入图像描述 在此处输入图像描述

    以及有关每个测试的信息:

    在此处输入图像描述

    Allure 是专门为解决这种性质的问题而创建的,所以我只是不明白开发自己的某种解决方案的意义。

    要生成这样的报告,只需遵循三个步骤:

    • 安装并连接allure-framework/allure-phpunit
    • 运行测试,在此期间 Allure 适配器收集有关正在运行的测试的信息。作为执行的结果,将收集有关测试执行的元数据(包括执行时间和以上所有内容)
    • 在元数据目录上下载并设置allure-cli :

      # создать отчет в директории Allure по результатам, хранящимся в директории allure-results
      allure generate -o Allure allure-results
      

    结果将是一组包含在 index.html 中的应用程序的文件。打开将需要一个任意服务器(Allure 需要发出 AJAX 请求,浏览器通常不允许文件),它已经包含在 allure-cli 中:

    allure open Allure --port 3333
    

    之后,你可以在http://localhost:3333看到结果

    • 1
  3. Best Answer
    sanmai
    2020-03-23T12:14:10Z2020-03-23T12:14:10Z

    Sergey 提出的选项接近理想,它只显示所有测试。并且有必要只看到缓慢的。

    但是,这很容易解决:

    class MyTestListener extends PHPUnit_Framework_BaseTestListener
    {
        private $longTests = [];
    
        public function endTest(PHPUnit_Framework_Test $test, $time)
        {
            if ($time > 0.1) {
                $this->longTests[join('::', [get_class($test), $test->getName()])] = $time;
            }
        }
    
        public function __destruct()
        {
            foreach ($this->longTests as $testName => $time) {
                $time = round($time, 2);
                echo "Тест '$testName' выполнялся $time секунды\n";
            }
        }
    }
    

    在本课程中,所有测试结束后,所有耗时超过十分之二秒的测试都将发布一份报告。

    在较新版本的 PHPUnit 中,您需要继承自PHPUnit\Framework\BaseTestListener.

    相应地出现一个phpunit.xml部分:

    <listeners>
        <listener class="MyTestListener">
        </listener>
    </listeners>
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5