我编写了一个抽象的测试用例类,由具体的测试用例类扩展.
它从PHPUnit_TestCase扩展而来.
是否有方法或注释表明Phpunit不执行此抽象测试(但不将其标记为跳过或不完整)?
现在Phpunit也运行抽象测试类,然后报告一个错误,它无法实例化它 - 这是语言:抽象类无法实例化.
我阅读了其他PHPUnit安装问题,但没有取得任何成功.我的PEAR安装发生了什么?
$ sudo pear update-channels
Updating channel "components.ez.no"
Channel "components.ez.no" is up to date
Updating channel "doc.php.net"
Channel "doc.php.net" is up to date
Updating channel "pear.php.net"
Channel "pear.php.net" is up to date
Updating channel "pear.phpunit.de"
Channel "pear.phpunit.de" is up to date
Updating channel "pear.symfony-project.com"
Channel "pear.symfony-project.com" is up to date
Updating channel "pecl.php.net"
Channel "pecl.php.net" is up to date
$ sudo pear upgrade pear
Nothing to upgrade
$ sudo pear install phpunit/PHPUnit
phpunit/PHPUnit requires PEAR Installer (version >= 1.9.2), installed …Run Code Online (Sandbox Code Playgroud) 我真的很不知道发生了什么 - 这一切都始于PHPUnit Error: No code coverage driver is available在尝试运行测试覆盖率报告时的错误,最后我调试到下面描述的可复制集.但要设置阶段 - 我使用的是Laravel 5.5,Xdebug 2.5.5,PHPUnit 6.5.5.我的测试代码说明了这个问题:
<?php
use Tests\TestCase;
class A extends TestCase
{
public function testA()
{
echo( get_cfg_var('cfg_file_path')); exit;
}
}
Run Code Online (Sandbox Code Playgroud)
输出 C:\Users\xxx\AppData\Local\Temp\7598.tmp
将它与输出正确的php.ini路径的代码进行比较:
<?php
use PHPUnit\Framework\TestCase;
class A extends TestCase
{
public function testA()
{
echo( get_cfg_var('cfg_file_path')); exit;
}
}
Run Code Online (Sandbox Code Playgroud)
输出: C:\server\php\php.ini
怎么会这样?加载的php.ini文件如何根据执行的代码进行更改?更好的是 - 如何加载我正确的php.ini文件(启用了xdebug),而不是这个冒号?
在这两种情况下,测试都是使用 phpunit tests\unit\a
文件夹结构是:
Laravel Project
????tests
????Unit
????A.php
Run Code Online (Sandbox Code Playgroud) 我在 GitHub 操作上运行 PHPUnit 测试时遇到错误。
PHP Fatal error: Cannot acquire reference to $GLOBALS in /home/runner/work/project-name/project-name/vendor/phpunit/phpunit/src/Util/Configuration.php on line 570
Run Code Online (Sandbox Code Playgroud)
看起来这个错误可能与 PHP8 ( https://php.watch/versions/8.1/GLOBALS-restrictions ) 有关,但测试矩阵应该只运行 PHP 7.2 和 7.4 (测试在 PHP 7.4 上本地运行良好)。
GitHub Actions中显示此处的错误。测试矩阵在这里。
非常感谢任何帮助!
--
编辑:
作为第一步,通过在容器中专门设置 PHP 版本来解决此问题:
# PHPUnit errors with latest PHP 8.X build.
# This specifically sets PHP version to 7.4.
- name: Setup PHP with tools
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: phpunit
Run Code Online (Sandbox Code Playgroud) RSPec是一个伟大的ruby测试框架(用于测试驱动开发),任何人都知道像rspec这样的东西,但对于PHP?
我刚刚在mac osx 10.7中通过pear安装了phpunit,除了内存限制错误(xdebug启用了报告)之外,一切正常.
我试图将-d memory_limit=512M参数添加到phpunit,但它不适用,因为,在第一个错误,我添加var_dump(ini_get('memory_limit')); exit;并打印字符串(3)"32M"
那么,为什么它没有被应用呢?
除此之外,如果我跑
php -d memory_limit=256M -r "echo ini_get('memory_limit');"
Run Code Online (Sandbox Code Playgroud)
它呼应"256M"
是不是phpunit可能没有执行相同的PHP?
我目前正在为我的项目使用PHPUnit和DBUnit.我在DBUnit中遇到问题,因为DBUnit PHPUnit_Extensions_Database_TestCaseSrc类似乎没有截断测试数据库上的现有数据.所以这使我的插入测试在仅工作一次后失败.
我使用的是mysql,这是我的代码:
abstract class Generic_Tests_DatabaseTestCase extends PHPUnit_Extensions_Database_TestCase
{
// only instantiate pdo once for test clean-up/fixture load
static private $pdo = null;
// only instantiate PHPUnit_Extensions_Database_DB_IDatabaseConnection once per test
private $conn = null;
final public function getConnection()
{
if ($this->conn === null) {
if (self::$pdo == null) {
self::$pdo = new PDO( "mysql:dbname=db;host=localhost", "root", "pass" );
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, "db");
}
return $this->conn;
}
}
class DbopTest extends Generic_Tests_DatabaseTestCase
{
private $db;
protected function setup(){
$this->db …Run Code Online (Sandbox Code Playgroud) 我是单元测试和PHPUnit的新手,但我最近读了很多关于设计模式和隔离测试的内容,我决定重构一个我正在努力摆脱静态类,单例,硬编码依赖项的应用程序.在全球范围内定义的任何其他内容,希望使其"可测试",而不是在未来保持屁股的痛苦,因为它本来是一个长期项目.
到目前为止,我相信我理解单元测试背后的理论,但我想知道,在一个委托处理对象的嵌套依赖关系到一个工厂的场景中,应该如何进行单元测试所述工厂,或者它是多余的来测试它?什么是测试依赖关系"链"同步工作的最佳方法?
让我来说明问题.假设您有以下"遗留"代码:
class House {
protected $material;
protected $door;
protected $knob;
public function __construct() {
$this->door = new Door();
$this->knob = $this->door->getKnob();
$this->material = "stone";
echo "House material: ".$this->material . PHP_EOL . "<br/>";
echo "Door material: ".$this->door->getMaterial() . PHP_EOL . "<br/>";
echo "Knob material: ".$this->knob->getMaterial() . PHP_EOL . "<br/>";
}
}
class Door {
protected $material;
protected $knob;
public function __construct() {
$this->knob = new Knob();
$this->material = "wood";
}
public function getKnob() {
return $this->knob;
}
public function …Run Code Online (Sandbox Code Playgroud) 对于下面的代码,
$mockObject->expects($this->at(0))
->method('search')
->with($searchConfig)
->will($this->returnValue([]));
Run Code Online (Sandbox Code Playgroud)
该行将自动断言,当它调用方法时,search它必须包含$searchConfig参数.在这种情况下,我们必须提供完全匹配,$searchConfig但有时如果它是一个数组或一个对象很难.
是否有任何可能的方法让PHPUnit调用某个特定的方法断言它包含参数传递方法我们想要?
例如,我可以创建闭包函数来断言如下,而不是使用->with()方法
function ($config){
$this->assertFalse(isset($config['shouldnothere']));
$this->assertTrue($config['object']->isValidValue());
}
Run Code Online (Sandbox Code Playgroud) 我正在使用.编写Zend Framework 3应用程序的集成/数据库测试
3.1.0,6.2.2,和3.0.0我的测试由于失败而失败
Connect Error: SQLSTATE[HY000] [1040] Too many connections
Run Code Online (Sandbox Code Playgroud)
我设置了一些断点并查看了数据库:
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
Run Code Online (Sandbox Code Playgroud)
我实际上已经看到了100打开的连接.
我通过断开连接来减少它们tearDown():
protected function tearDown()
{
parent::tearDown();
if ($this->dbAdapter && $this->dbAdapter instanceof Adapter) {
$this->dbAdapter->getDriver()->getConnection()->disconnect();
}
}
Run Code Online (Sandbox Code Playgroud)
但我仍然有过度80开放的联系.
如何将测试中的数据库连接数减少到可能的最小值?
更多信息
(1)我有很多测试,其中我dispatch是一个URI.每个此类请求都会导致至少一个数据库请求,从而导致新的数据库连接.这些连接似乎没有关闭.这可能会导致最多的连接.(但是我还没有找到一种方法让应用程序在处理请求后关闭连接.)
(2)其中一个问题可能是我对数据库的测试:
protected function retrieveActualData($table, $idColumn, $idValue)
{
$sql = new Sql($this->dbAdapter);
$select = $sql->select($table);
$select->where([$table . '.' . $idColumn . ' = ?' => …Run Code Online (Sandbox Code Playgroud) php ×10
phpunit ×10
unit-testing ×4
xdebug ×2
dbunit ×1
laravel-5.5 ×1
macos ×1
memory-limit ×1
pdo ×1
pear ×1
rspec ×1
ruby ×1
testing ×1
ubuntu ×1