unitarias unit test run pruebas make example ejemplos descargar php unit-testing phpunit

test - La creación de una clase de prueba base para PHPUnit y su extensión para la funcionalidad común da como resultado un error de clase no encontrada



pruebas unitarias (4)

Estoy ejecutando PHPUnit utilizando un archivo de rutina de carga para las clases de carga automática (generadas por el compositor).

Todas mis pruebas cargan clases muy bien, pero para dos de mis pruebas, hice una clase de prueba "base" que extiende PHPUnit_Framework_TestCase, y luego dos clases de prueba que extienden la clase base, estructura similar al siguiente código de ejemplo:

abstract class BaseTest extends PHPUnit_Framework_TestCase { abstract function setUp(); protected function getCommonTestVariables() { // ... } protected function runCommonTests() { // ... } }

class BlahBlahTest extends BaseTest { public function setUp() { $variables=$this->getCommonTestVariables(); //etc... } public function testThings() { $this->runCommonTests(); } }

Cada vez que ejecuto esto, PHPUnit da un error:

Error fatal: la clase ''BaseTest'' no se encuentra en BlahBlahTest.php en la línea 13

He comprobado los nombres de archivos, ubicaciones, espacios de nombres y todo parece estar en orden. Cualquier ayuda sería apreciada para llegar al fondo de esto.


En PHP 7.0+ se extends PHPUnit_Framework_TestCase cambiado a extends PHPUnit_Framework_TestCase extends /PHPUnit/Framework/TestCase , pruebe este.


Me encontré con el mismo problema y si no está muy familiarizado con el funcionamiento interno de PHPUnit y Composer, esto puede parecer desconcertante.

PHPunit no usa el autocargador Composer para encontrar ninguna de sus clases de prueba. Simplemente escanea cualquier directorio que le des y opera en un archivo a la vez.

Por lo tanto, no conoce ninguna otra clase que no sea la del archivo en el que está funcionando actualmente. Ahí es donde el archivo bootstrap entra en juego.

Si desea usar Composer Autoloader para cargar otras clases de prueba, necesita decirle dónde puede encontrar estas clases de prueba (y, opcionalmente, en qué espacio de nombres).

Hay dos maneras de hacer esto:

  1. Agregue una sección autoload-dev a su composer.json o
  2. Agregue el directorio de prueba al Compositor Autoloader

Usar autoload-dev

Las secciones autoload-dev permiten definir reglas de autocarga para propósitos de desarrollo.

Citando directamente del autoload-dev :

Las clases necesarias para ejecutar el conjunto de pruebas no deben incluirse en las reglas principales de carga automática para evitar contaminar el autocargador en producción y cuando otras personas usan su paquete como una dependencia.

Por lo tanto, es una buena idea confiar en una ruta dedicada para las pruebas de unidad y agregarla dentro de la sección autoload-dev.

Ejemplo:

{ "autoload": { "psr-4": { "MyLibrary//": "src/" } }, "autoload-dev": { "psr-4": { "MyLibrary//Tests//": "tests/" } } }

Añadir al Compositor Autoloader

Una alternativa sería obtener Composer Autoloader y add su espacio de nombres de prueba (si tiene alguno) y el directorio donde se realizan las pruebas. La forma de hacerlo, como se describe en el manual (en la parte inferior de la sección de carga automática en "Uso básico") es:

$loader = require(''/path/to/vendor/autoload.php''); $loader->add(''Test//', __DIR__ . ''/Tests'');

Si sus pruebas usan espacios de nombres que reflejan el directorio de prueba y aún tiene problemas, puede intentar omitir el prefijo reemplazando el primer parámetro ( ''Test//' ) con '''' .

Si desea obtener más información sobre cómo funciona todo esto, debería echar un vistazo a la clase Composer ClassLoader , especialmente los métodos add() y findFile() .



Para mí la solución fue mucho más simple.

  1. Cambié la letra mayúscula de Test para test al final del archivo y el nombre de la clase

BaseSomethingtest.php

<?php namespace Something/Tests/Sub1/Sub2; class BaseSomethingtest { }

  1. Acabo de poner una palabra al final de mi clase base. En cuanto a que no terminó con Test , phpunit no lo llamó

BaseSomethingTestCase.php

<?php namespace Something/Tests/Sub1/Sub2; class BaseSomethingTestCase { }