我有一个PHP MVC框架,在该系统下有多个"应用程序"
\project\apps\app1\
\project\apps\app2\
\project\apps\shared\
Run Code Online (Sandbox Code Playgroud)
每个应用程序都可以拥有自己的一组控制器
\project\apps\app1\controllers\FooContoller.php
\project\apps\app2\controllers\FooContoller.php
\project\apps\shared\controllers\BarContoller.php
Run Code Online (Sandbox Code Playgroud)
我想设置我的PHPUnit测试空间以便能够测试每个应用程序目录,但我希望以"最佳"方式进行测试.
PHPUnit的设置如下:
\project\PHPUnit
\project\PHPUnit\phpunit.xml
\project\PHPUnit\apps\app1\bootstrap.php
\project\PHPUnit\apps\app1\controllers
\project\PHPUnit\apps\app1\controllers\FooControllerTest.php
\project\PHPUnit\apps\app2\bootstrap.php
\project\PHPUnit\apps\app2\controllers
\project\PHPUnit\apps\app2\controllers\FooControllerTest.php
Run Code Online (Sandbox Code Playgroud)
现在问题是:配置我的phpunit.xml文件的"最佳实践"方法是什么?
就目前而言,我试图将这两个应用程序作为自己的测试套件包含在XML文件中,但我很快就遇到了"Can not Redeclare Class:FooController".
在我看来,理想的情况是配置XML,以便为app1运行所有测试,然后"清除"内存,并为app2运行所有测试.
然而,在最佳实践方面,最好有多个XML文件,每个APP一个.(然后可能是批处理/ shellscript文件来运行"全部测试"或测试X)
如果我们查看"典型的"PHPUnit XML配置文件:
<phpunit bootstrap="./apps/app1/bootstrap.php" colors="true">
<testsuite name="App1TestSuite">
<directory>./</directory>
</testsuite>
<filter>
<whitelist>
<directory suffix=".php">./apps/app1/controllers/</directory>
<directory suffix=".php">./apps/shared/</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./log/report.html" charset="UTF-8"
yui="true" highlight="true"
lowUpperBound="50" highLowerBound="80"/>
<log type="testdox-html" target="./log/testdox.html" />
</logging>
</phpunit>
Run Code Online (Sandbox Code Playgroud)
我应该选择其中的许多吗?或者我应该添加 标记并将所有文件设置组合在一个XML配置中.
如果最佳做法是"单一配置"......有没有人知道如何启用多个"bootstraps"?由于每个APP加载的全局变量略有不同,有些会加载略有不同版本的同名类,因此有必要清除所有内容并重新开始.
我有兴趣从一开始就构建用于测试的"最佳"系统,但显然我知道一些漏洞.
我怀疑PHPUnit显示单行测试没有涵盖1行代码,因为抛出的异常(但我抓到了)
我有单元测试应该涵盖那一行
/**
* @expectedException Doctrine\ORM\NoResultException
*/
public function testCannotLoginInvalidUser() {
$user = User::login($this->em, 'nonExistant', 'password');
$this->assertNull($user);
}
Run Code Online (Sandbox Code Playgroud)
为什么我的代码覆盖率仍然反映不包括在内?
我做了一个测试...添加echo b4返回null ...我发现那行真的没有被覆盖......
try {
$user = $query->getSingleResult();
} catch (Exception $e) {
echo 'caught exception'; <-- this does not get executed.
return null;
}
Run Code Online (Sandbox Code Playgroud)
一旦抛出异常,PHPUnit是否会跳过所有执行?
更新:我觉得我使用@expectedException错了......
对于unittest
class SampleTest extends PHPUnit_Framework_TestCase
{
public function testBreakpoint()
{
$a = 18;
}
}
Run Code Online (Sandbox Code Playgroud)
断点5号线"$ a = 18;",
使用NO --process-isolation选项运行unittest可以按预期停止第5行的脚本执行.运行相同的配置WITH --process-isolation选项不会在第5行停止执行.
选项--process-isolation在https://github.com/sebastianbergmann/phpunit/blob/3.6/PHPUnit/Util/PHP.php中的runJob函数中使用'proc_open'运行新进程中的每个测试
使用调试器插件测试PhpStorm 3和vim 7.它允许调试PHPUnit本身,但不允许调试测试用例.
有没有办法使用Xdebug调试由PhpUnit创建的子进程?可能是Zend Debugger?
我正在尝试创建一个模拟来满足使用此代码的类型提示(Mockery):
return \Mockery::mock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)
或者这个(PHPUnit):
return $this->getMock('\Contracts\Helpers\iFileSystemWrapper');
Run Code Online (Sandbox Code Playgroud)
但返回的模拟称为Mockery\Mock Object或Mock_iFileSystemWrapper_a5f91049.当它不是我需要的任何一个框架的实例时,我该如何键入检查?
为什么模拟框架试图加载真正的类?如果我想要真正的课程,我会包括真正的课程.
这个问题在编写测试时已经减慢了很多次,我只是抛出类型暗示窗口并检查类名,或者只是使用生产对象,因为模拟很难使用.
我有一个接收数组作为参数的测试方法,我想从数据提供程序方法提供数据?
怎么能实现呢?
public function dataProvider(){
return array(array(
'id'=>1,
'description'=>'',
));
}
/**
* @dataProvider dataProvider
*/
public function testAddDocument($data){
// data here shall be an array provided by the data provider
// some test data here
}
Run Code Online (Sandbox Code Playgroud)
会发生什么,它传递'id'键等的值
我想传递整个数组
首先,我会说我来自Java世界(这很重要,真的).
我已经编写了一段时间的PHP,我遇到的一个问题是由于缺少编译,有时可能在编译时很容易检测到错误(例如,给定函数的参数数量错误),可以默默地通过.
通过添加单元测试,可以轻松检测到代码覆盖率增加.问题是,例如测试构造函数以检查传递的参数是否正确是否有意义?我不是指参数的数量,而是指这些参数的内容(例如,如果参数为null,某些对象应该启动异常以避免创建"脏"对象).
问题是,我是否被多年的Java代码污染了?因为毕竟,增加代码覆盖率以"发现"错过的函数感觉就像(真正)原始的编译方式.
另外,我想说明我已经使用了开发环境(PHPStorm),我们也使用了像PHPCodeSniffer这样的工具.
有什么想法/建议吗?
有没有办法在Symfony 2应用程序中正确单元测试Doctrine模型?现在我正在编写通过控制器的功能测试,以确保我的应用程序正确存储(和CRUDing)数据.但这需要太长时间而且非常糟糕,因为我必须为每个套件设置灯具,并在套件完成后清除数据库.
我如何隔离Entity和EntityRepository单元测试?有关于此的教程吗?
在添加ArrayCollection成员的表单的功能测试中,有以下声明:
$ form ['client [members] [1] [fname]'] ='Benny';
使用DOM检查器验证了字段名称.
此行的控制台输出是:
InvalidArgumentException: Unreachable field "members"
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:459
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:496
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:319
G:\Documents\workspace\sym\src\Mana\ClientBundle\Tests\Controller\ClientControllerTest.php:57
Run Code Online (Sandbox Code Playgroud)
应该使用什么方法来测试添加ArrayCollection成员?
Run Code Online (Sandbox Code Playgroud)//link to trigger adding household member form $link = $crawler->selectLink('Add household member')->link(); $crawler = $client->click($link); $form = $crawler->selectButton('Add client')->form(); $form['client[members][1][fname]'] = 'Benny'; $form['client[members][1][dob]'] = "3/12/1999"; $crawler = $client->submit($form); $this->assertTrue($crawler->filter('html:contains("Client View Form")')->count() > 0);
我正在使用PHPUnit并尝试检查页面上是否存在文本.assertRegExp工作但使用if语句我得到错误Failed asserting that null is true.
我知道$ test返回null,但是如果文本存在,我不知道如何让它返回1或0或true/false?任何帮助都表示感谢.
$element = $this->byCssSelector('body')->text();
$test = $this->assertRegExp('/find this text/i',$element);
if($this->assertTrue($test)){
echo 'text found';
}
else{
echo 'not found';
}
Run Code Online (Sandbox Code Playgroud) 如果您配置了多个测试套件,phpunit.xml如何在命令行中运行多个测试套件而不是所有测试套件?
phpunit.xml
<?xml version="1.0" encoding="utf-8"?>
<phpunit
backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="true"
syntaxCheck="true"
bootstrap="tests/bootstrap.php">
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">tests/unit</directory>
</testsuite>
<testsuite name="Integration">
<directory suffix="Test.php">tests/integration</directory>
</testsuite>
<testsuite name="Acceptance">
<directory suffix="Test.php">tests/acceptance</directory>
</testsuite>
</testsuites>
<logging>
<log type="coverage-html" target="build/coverage"/>
<log type="testdox-html" target="build/requirements.html"/>
</logging>
<filter>
<whitelist>
<directory suffix=".php">src</directory>
</whitelist>
</filter>
</phpunit>
Run Code Online (Sandbox Code Playgroud)
例
phpunit --testsuite Unit|Integration 但不是 Acceptance
phpunit ×10
php ×6
symfony ×2
unit-testing ×2
architecture ×1
assert ×1
doctrine-orm ×1
exception ×1
mockery ×1
mocking ×1
phpstorm ×1
process ×1
xdebug ×1