如何将PHPUnit与TestCaseTrait一起使用

如何将PHPUnit与TestCaseTrait一起使用,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,我是单元测试的新手。我阅读并尝试做同样的事情 首先,我有下一个环境: $ php -v PHP 7.0.15-1+deb.sury.org~trusty+1 (cli) (built: Jan 20 2017 09:16:11) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.15-1

我是单元测试的新手。我阅读并尝试做同样的事情

首先,我有下一个环境:

$ php -v
PHP 7.0.15-1+deb.sury.org~trusty+1 (cli) (built: Jan 20 2017 09:16:11) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.15-1+deb.sury.org~trusty+1, Copyright (c) 1999-2017, by Zend Technologies

$ cat composer.json 
...
"require-dev": {
    "phpunit/phpunit": "^6.0",
    "phpunit/dbunit": "^3.0"
},
...
我有/src、/tests和/vendor目录。作曲家自动加载器作品完美

我的PHP项目与MySQL数据库紧密结合,我只想对这些功能进行单元测试

$ cat tests/phpunit.xml 
<phpunit>
    <php>
        <ini name="display_errors" value="On" />
        <ini name="display_startup_errors" value="On" />
    </php>
</phpunit>
$cat tests/phpunit.xml
以及测试:

$ cat tests/SimpleTest.php 
<?php
use PHPUnit\Framework\TestCase;
use PHPUnit\DbUnit\TestCaseTrait;

require_once(__DIR__.'/../vendor/autoload.php');

class SimpleTest extends TestCase
{
    // use TestCaseTrait;

    protected function getConnection() {}
    protected function getDataSet() {}

    public function testFirstExample()
    {
        $this->assertEquals(1, 1);
    }

    public function testSecondExample()
    {
        $this->assertEquals(1, 0);
    }

}
?>

$ phpunit --testdox --verbose --configuration=tests/phpunit.xml tests/SimpleTest.php 
PHPUnit 6.0.6 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.15-1+deb.sury.org~trusty+1
Configuration: /home/ubuntu/workspace/tests/phpunit.xml

Simple
 [x] First example
 [ ] Second example
$cat tests/SimpleTest.php
$phpunit--testdox--verbose--configuration=tests/phpunit.xml tests/SimpleTest.php
由塞巴斯蒂安·伯格曼和贡献者编写的PHPUnit 6.0.6。
运行时:PHP7.0.15-1+deb.sury.org~trusty+1
配置:/home/ubuntu/workspace/tests/phpunit.xml
简单的
[x] 第一个例子
[]第二个例子
一切正常,并按预期工作,直到我取消注释行
usetestcasetracit。从现在起,测试就不起作用了。
它们甚至没有在测试函数中执行(我通过添加下一个代码进行检查:
fwrite(STDERR,'Here we's!')

问题是:
使用TestCaseTracit有什么问题语句?为什么它打破了整个测试?我怎样才能解决它

谢谢大家!! 对我的英语很抱歉


结论: 这很奇怪,但问题出在
setUp()
函数中。你必须在测试中添加它!当我这么做的时候,我的测试变得正常了

结论:这很奇怪,但问题出在setUp()函数中。 你必须在测试中添加它!当我这么做的时候,我的测试变成了工作 恰当地

这并不奇怪,看看日志

1) SimpleTest::testFirstExample
TypeError: Argument 1 passed to PHPUnit\DbUnit\DefaultTester::__construct() must be an instance of PHPUnit\DbUnit\Database\Connection, null given, called in /x/vendor/phpunit/dbunit/src/TestCaseTrait.php on line 102

2) SimpleTest::testSecondExample
TypeError: Argument 1 passed to PHPUnit\DbUnit\DefaultTester::__construct() must be an instance of PHPUnit\DbUnit\Database\Connection, null given, called in /x/vendor/phpunit/dbunit/src/TestCaseTrait.php on line 102
这条线呢

# TestCaseTrait::102
return new DefaultTester($this->getConnection());
$this->getConnection()
的结果是
null
,因为您已经将
getConnection
方法实现为
受保护的函数getConnection(){}


通过声明
setUp
您刚刚覆盖了调用
$this->getConnection()
testcasetracit::setUp
,这就是它现在工作的原因。

不确定这是否是您的问题,但查看表明
getConnection
getDataSet
应该返回一些内容。在你的例子中它们是无效的。我当然试过了。这些函数返回
$this->createDefaultDBConnection($pdo,'test')
新的MyApp\u DbUnit\u ArrayDataSet(数组(…)
(如文档中所示)。但这不会改变任何事情……没错。请告诉我,你是怎么得到这些日志的?它们对解决问题非常有帮助。@GHopper我用命令行执行了测试,这些错误都是在输出中出现的。如何执行您的测试?
phpunit--testdox--verbose--configuration=tests/phpunit.xml tests/SimpleTest.php