symfony selenium behat mink

symfony - Optimizar behat test suite



selenium mink (2)

Publicaré los resultados aquí después de implementar todas las sugerencias anteriores para que otros vean cómo funcionó, así que cada vez que cubro un paso, actualizaré esta publicación.

TIEMPO ORIGINAL:

Total time: 4 minutes 12.55 seconds

TIEMPO DESPUÉS DE IMPLEMENTAR EL PASO 1:

Total time: 2 minutes 8.01 seconds

Nota : Solo @BeforeScenario parece estar funcionando porque acceder a $ this key en métodos estáticos no está permitido en OOP ya que @BeforeFeature y @BeforeSuite requieren que resizeWindow () sea estático. Si fuera posible, el resultado sería mucho más rápido.

TIEMPO DESPUÉS DE IMPLEMENTAR EL PASO 2:

Nota : Lea el paso 6 a continuación.

TIEMPO DESPUÉS DE IMPLEMENTAR EL PASO 3:

Nota : soy un usuario de Symfony2 y desafortunadamente no pude implementar este punto.

TIEMPO DESPUÉS DE IMPLEMENTAR EL PASO 4:

Total time: 1 minutes 54.11 seconds

Nota : Usuarios de Behat 3: ejecute selenio con java -jar selenium-server-standalone-2.43.1.jar -Dwebdriver.chrome.driver="chromedriver"

TIEMPO DESPUÉS DE LA IMPLEMENTACIÓN DEL PASO 6:

Total time: 0 minutes 52.04 seconds

Nota : Usuarios de Symfony2: si configura default_session para symfony2 , se está desangrando rápidamente en comparación con goutte y selenium2. Goutte: 1 minuto 20,03 segundos, Selenio2: 1 minuto 31,00 segundos

Tengo un banco de pruebas que tiene 20 archivos de feaure y se están llevando a cabo operaciones 100% MySQL CRUD. Tarda unos 5 minutos en terminar. Si hiciera la prueba manualmente, tomaría aproximadamente 7 minutos como máximo. Lo que necesito saber es qué debo hacer para optimizar todo el proceso.

Nota : ParallelRunnder no es compatible con Behat 3, por lo que está fuera de alcance por ahora.

Si va a sugerir utilizar Behat 3, entonces ayúdeme a modificar mis archivos composer.json y behat.yml porque cuando lo hago yo mismo y ejecuto bin / behat obtengo errores como:

`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"

Como puede ver a continuación, uso números de versiones seguras, no signos de estrellas.

CORRIENTE 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" },

CORRIENTE 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

EDITAR :

Tengo 20 archivos de características y un escenario en cada uno. Para las operaciones CRUD:

  • Tengo el método de inicio de sesión ejecutándose en cada escenario. Query se ejecuta contra DB.
  • Algunos escenarios lo hacen INSERT, algunos para ACTUALIZAR y otros lo hacen DELETE.
  • Estoy usando pdo_mysql como pdo_mysql database_driver

Una parte de mi archivo 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''); } ......... }


No sé por qué pensé que tardaría 20 minutos en correr, probablemente confundido con la cantidad de funciones. 5 minutos no está nada mal. Hay algunas cosas básicas que puede hacer que pueden ayudar a acelerarlo.

  1. Lógica dentro de su @BeforeStep : probablemente pueda moverlo a @BeforeScenario o incluso a @BeforeFeature o incluso a @BeforeSuite - no hay necesidad de hacerlo con tanta frecuencia.
  2. Muy obvio, pero por las dudas: el controlador Goutte es sorprendentemente rápido en comparación con otros, lo negativo es que no es compatible con JS y no puede tomar capturas de pantalla. Pero considero que la aplicación Symfony no involucra a gran parte de JS para realizar operaciones CRUD. Por lo tanto, comprueba dos veces todo lo que no implica a JS y úsalo con Goutte.
  3. iLoginAs probablemente se usa en cada paso. Puede actualizar esto para que sea mucho más rápido creando manualmente una sesión de usuario y configurando la cookie como un encabezado, es decir, la misma lógica de su método de autenticación va en la definición del paso y luego simplemente hace $this->getSession()->getDriver()->setCookie(session_name(), session_id()); - en la siguiente solicitud su usuario ya está autenticado.
  4. browser_name: firefox - dios no ... use chrome , debe ser más rápido.
  5. El uso de HHVM para ejecutar pruebas de Behat (la aplicación aún usa el viejo y bueno PHP) dará un buen aumento en el rendimiento. Podría ser un dolor instalarlo, especialmente en Mac.
  6. Finalmente, migre a Behat 3, eso no debería ser doloroso en absoluto. Han tomado mucho conocimiento de 2.x y lo han utilizado para mejorarlo, incluidos los aspectos de rendimiento. También es mucho más flexible en la configuración, permite que múltiples contextos mantengan las cosas mejor organizadas y más limpias.