优化行为测试套件

2023-12-12

我有一个测试套件,其中有 20 个功能文件,并且正在执行 100% MySQL CRUD 操作。大约需要 5 分钟才能完成。如果我手动进行测试,最多需要大约 7 分钟。我需要知道的是,我需要做什么才能优化整个流程?

Note: 平行跑者不支持对于 Behat 3,因此目前超出范围!

如果您建议使用 Behat 3,那么请帮助我修改我的composer.json 和 behat.yml 文件,因为当我自己执行此操作并运行 bin/behat 时,我会收到如下错误:

`Behat\Symfony2Extension\Extension` extension file or class could not be located.
`Behat\MinkExtension\Extension` extension file or class could not be located. 
Unrecognized options "mink_driver" under "testwork.symfony2"
Unrecognized options "context, paths" under "testwork" 

正如您在下面看到的,我使用某些版本号,没有星号。

当前的composer.json:

"require": {
    "php": ">=5.3.3",
    "symfony/symfony": "2.5.4",
    "doctrine/orm": "~2.2,>=2.2.3",
    "doctrine/doctrine-bundle": "~1.2",
    "twig/extensions": "~1.0",
    "symfony/assetic-bundle": "~2.3",
    "symfony/swiftmailer-bundle": "~2.3",
    "symfony/monolog-bundle": "~2.4",
    "sensio/distribution-bundle": "~3.0",
    "sensio/framework-extra-bundle": "~3.0",
    "incenteev/composer-parameter-handler": "~2.0",
    "behat/behat": "2.5.3",
    "behat/behat-bundle": "1.0.0",
    "behat/symfony2-extension": "1.1.2",
    "behat/mink": "1.5.0",
    "behat/mink-extension": "~1.3",
    "behat/mink-selenium2-driver": "1.1.1",
    "behat/mink-goutte-driver": "1.0.9"
},

当前的 behat.yml:

default:
    context:
        class: FeatureContext
        parameters:
            output_path: %behat.paths.base%/build/behat/output/
            screen_shot_path: %behat.paths.base%/build/behat/screenshot/
    extensions:
        Behat\Symfony2Extension\Extension:
            mink_driver: true
            kernel:
                env: test
                debug: true
        Behat\MinkExtension\Extension:
            base_url: 'http://symfony.local/app_test.php/'
            files_path: %behat.paths.base%/build/dummy/
            javascript_session: selenium2
            browser_name: firefox
            goutte: ~
            selenium2: ~
    paths:
        features: %behat.paths.base%/src
        bootstrap: %behat.paths.features%/Context

EDIT:

我有 20 个功能文件,每个文件一个场景。对于CRUD操作:

  • 我在每个场景中都运行登录方法。针对数据库运行查询。
  • 有些场景执行 INSERT,有些场景执行 UPDATE,有些场景执行 DELETE。
  • 我在用着pdo_mysql as database_driver

我的 FeatureContext 文件的一部分:

namespace Site\CommonBundle\Features\Context;

use Behat\MinkExtension\Context\MinkContext;
use Behat\Mink\Exception\UnsupportedDriverActionException;
use Behat\Mink\Driver\Selenium2Driver;
use Behat\Symfony2Extension\Context\KernelAwareInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Process\Process;

/**
 * Class FeatureContext
 *
 * Parent to other FeatureContext files. It is used to avoid duplicated codes and all the
 * shared commons are kept here.
 *
 * @package Site\CommonBundle\Features
 */
class FeatureContext extends MinkContext implements KernelAwareInterface
{
    protected $kernel;
    protected $screenShotPath;
    protected $outputPath;

    /**
     * Parameter $parameters comes from behat.yml file.
     * @param array $parameters
     */
    public function __construct(array $parameters)
    {
        $this->outputPath = $parameters['output_path'];
        $this->screenShotPath = $parameters['screen_shot_path'];
    }

    /**
     * Helps to use doctrine and entity manager.
     * @param KernelInterface $kernelInterface Interface for getting Kernel.
     */
    public function setKernel(KernelInterface $kernelInterface)
    {
        $this->kernel = $kernelInterface;
    }

    /**
     * Without this, PhantomJs will fail if responsive design is in use.
     * @BeforeStep
     */
    public function resizeWindow()
    {
        $this->getSession()->resizeWindow(1440, 900, 'current');
    }

    /**
     * Take screen-shot when step fails. Works only with Selenium2Driver.
     *
     * @AfterStep
     * @param $event Current event.
     * @throws \Behat\Mink\Exception\UnsupportedDriverActionException
     */
    public function takeScreenshotAfterFailedStep($event)
    {
        if (4 === $event->getResult()) {
            $driver = $this->getSession()->getDriver();

            if (! ($driver instanceof Selenium2Driver)) {
                throw new UnsupportedDriverActionException(
                    'Taking screen-shots is not supported by %s, use Selenium2Driver instead.',
                    $driver
                );

                return;
            }

            if (! is_dir($this->screenShotPath)) {
                mkdir($this->screenShotPath, 0777, true);
            }

            $filename = sprintf(
                '%s_%s_%s.%s',
                $this->getMinkParameter('browser_name'),
                date('Ymd') . '-' . date('His'),
                uniqid('', true),
                'png'
            );

            file_put_contents($this->screenShotPath . '/' . $filename, $driver->getScreenshot());
        }
    }

    /**
     * @When /^I login as "([^"]*)"$/
     * @param $type User role type.
     */
    public function iLoginAs($type)
    {
        $container = $this->kernel->getContainer();
        $userData = $container->getParameter('dummy_user');

        $this->visit('/login');
        $this->fillField('username', $userData[$type]['username']);
        $this->fillField('password', $userData[$type]['password']);
        $this->pressButton('_submit');
    }
    .........
}

我不知道为什么我认为运行需要 20 分钟,可能是与功能数量混淆了。 5分钟一点也不差。您可以做一些基本的事情来帮助加快速度。

  1. 你内心的逻辑@BeforeStep– 你也许可以将它移入@BeforeScenario甚至进入@BeforeFeature甚至进入@BeforeSuite– 没有必要经常这样做。
  2. 非常明显,但以防万一:与其他驱动程序相比,Goutte 驱动程序速度快得惊人,缺点是它不支持 JS 并且无法截图。但我认为 Symfony 应用程序不涉及太多 JS 来执行 CRUD 操作。因此,仔细检查所有不涉及 JS 的内容并将其与 Goutte 一起使用。
  3. iLoginAs可能在每个步骤中都会用到。您可以通过手动创建用户会话并将 cookie 设置为标头来更快地更新此内容,即,将身份验证方法中的相同逻辑放入步骤定义中,然后您只需执行以下操作即可$this->getSession()->getDriver()->setCookie(session_name(), session_id());– 在下一个请求时,您的用户已经通过身份验证。
  4. browser_name: firefox– 上帝不…使用chrome,一定会更快。
  5. 使用 HHVM 运行 Behat 测试(该应用程序仍然使用旧的良好 PHP)将大大提高性能。安装它可能会很痛苦,尤其是在 Mac 上。
  6. 最后,迁移到 Behat 3,这应该不会很痛苦。他们从 2.x 中汲取了大量知识,并用它来改进它,包括性能方面。它的配置也更加灵活,允许多个上下文以使事物更好地组织和清洁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化行为测试套件 的相关文章

随机推荐

  • Python:线程可以同时读/写同一个 TCP 套接字吗?

    我想要同一个 TCP 套接字有一个读取器线程和一个写入器线程 可以吗 在访问之前我需要锁定吗 平台是Windows 7 CPython 2 7 4 对于 Unix 内核 两个线程一个读取另一个写入文件 套接字 与两个进程执行相同操作相同 由
  • 如何使用 webview url 发送标头值?

    我开发了一个带有 webview 的 android 应用程序 我想用 url 发送标头值 如果可能的话谁帮我提供一下源代码 Map
  • Java 中的泛型,使用通配符

    我有一个关于 Java 泛型的问题 即使用通配符 我有一个像这样的 GenClass 示例类 public class GenClass
  • 使用 Typescript 和 Visual Studio 2015 运行时进行编辑?

    在 Visual Studio 2013 中使用 Typescript 时 我似乎记得我可以在浏览器窗口中运行 TypeScript 源时编辑它 然后刷新浏览器窗口并获取新的更改 现在 在 Visual Studio 2015 中 Visu
  • DBpedia SPARQL 查询返回多个重复记录

    我对 SPARQL 还很陌生 并且对它现有的多种语法标准感到困惑 我正在努力使用以下查询从 DBpedia 获取唯一数据 SELECT DISTINCT Museum name abstract thumbnail latitude lon
  • Kotlin - 当前实例的返回类型

    我正在 Kotlin 中构建一个验证库 基类是abstract并实现适用于所有类型的方法 isNotNull例如 abstract class Validator
  • 通过 QTcpSocket 发送任何结构

    在写入套接字之前如何将结构转换为 char 形式 Use 数据流 它具有处理 Qt 类的字节顺序 字节顺序 和序列化的优点 简单地将结构转换为 char 可能会导致很多问题 包括字节顺序 编译器填充等 我建议使用流
  • 修改正在运行的SKAction的速度

    我有这个代码 implementation MyScene SKAction delayAction Inside a method delayAction SKAction waitForDuration 3 0 self runActi
  • 在 Rails 中批量导入 CSV?

    我正在使用 FasterCSV 将上传的文件导入到模型中 它非常适合小文件 然而 当我尝试导入大型数据集 21 000 行 时 需要很长时间 并且实时服务器上的浏览器超时 这是我当前的工作代码 logcount 0 Attendee tra
  • 在 python 中使用自定义步骤进行循环

    我可以在 python 中制作简单的 for 循环 例如 for i in range 10 然而 我不知道如何制作更复杂的 这在 C 中非常容易 如何在 python 中实现这样的 for 循环 for w n w gt 1 w w 2
  • 对三个数字进行排序的更简单方法

    有没有更简单更好的方法来解决这个问题 因为 我使用了太多变量 我用了这么多if else声明 我使用蛮力方法做到了这一点 编写一个程序 接收三个整数作为输入并按升序输出数字 不要使用循环 数组 include
  • Web API:无法序列化内容类型的响应正文

    我正在使用 ASP NET MVC 5 Web Api 我现有的应用程序包含许多 api 最近我实现了自定义 JsonConverter 它将根据时区转换日期 public class CustomInfoConverter JsonCon
  • TypeError - python 中的客户端错误

    我用 python 创建了一个客户端 服务器代码 服务器运行良好并侦听 8000 端口 但是当我通过客户端连接到它然后尝试向服务器发送消息时 出现以下错误 Traceback most recent call last File C Use
  • 如何检索 ADO.NET SqlCommand 的结果?

    我正在使用 ASP NET 我想查找表中的行数 我知道这是 SQL 代码 select count from topics 但是如何让它显示为数字呢 我想做的就是运行该代码 如果它 0 显示一件事 但如果它大于 0 显示其他内容 这是我到目
  • 如何将QLineEdit背景变成进度条

    该代码创建一个对话框QLineEdit and a QPushButton 单击按钮时我想要QLineEdit变成一个进度条 显示按下按钮触发的过程的进度 当该过程完成时QLineEdit应该恢复到正常的 LineEdit 外观 如何实现这
  • 检查字符串是否以以下结尾

    我想检查字符串是否以以下结尾 v number 例如 hello world false hello world v2 true hello world v false hello world v88 true 不完全确定如何执行此正则表达
  • “与 Google 集成”按钮消失

    这是我们的 Google Apps Marketplace 应用程序的列表 该按钮也从我们集成的每个页面上消失了 当我在应该出现该按钮的页面上查看浏览器中的控制台日志时 我看到对此网址的调用 https apis google com ad
  • 根据序列号重命名匹配的文件

    假设我有一堆 mac 屏幕截图的文件 Screen Shot 2018 11 09 at 12 37 37 PM png Screen Shot 2018 11 10 at 4 53 02 PM png Screen Shot 2018 1
  • Chartjs - 如何在 x 轴标签上获取过去 7 天的数据?

    我试图在折线图的 x 轴上获取过去 7 天的信息 使用 Chartjs 做这个的最好方式是什么 Thanks 您可以使用以下代码实例化过去 7 天的图表 let start new Date end new Date start setDa
  • 优化行为测试套件

    我有一个测试套件 其中有 20 个功能文件 并且正在执行 100 MySQL CRUD 操作 大约需要 5 分钟才能完成 如果我手动进行测试 最多需要大约 7 分钟 我需要知道的是 我需要做什么才能优化整个流程 Note 平行跑者不支持对于