我基本上相信单元测试的好处,我想开始将这个概念应用于用PHP编写的大型现有代码库.不到10%的代码是面向对象的.
我看了几个单元测试框架(PHPUnit,SimpleTest和phpt).但是,我没有找到测试过程代码的任何示例.什么是我的情况最好的框架,有没有使用非OOP代码单元测试PHP的例子?
是否可以通过命令行测试运行器指定从配置文件运行哪个测试套件?例如,如果我有以下xml配置:
<phpunit ...>
<testsuites>
<testsuite name="My Test Suite 1">
<directory>./MyTestSuite1/</directory>
</testsuite>
<testsuite name="My Test Suite 2">
<directory>./MyTestSuite2/</directory>
</testsuite>
</testsuites>
...
</phpunit>
Run Code Online (Sandbox Code Playgroud)
我可以只运行"我的测试套件1"吗?
我正在为现有代码编写单元测试,就像这样
class someClass {
public function __construct() { ... }
public function someFoo($var) {
...
$var = "something";
...
$model = new someClass();
model->someOtherFoo($var);
}
public someOtherFoo($var){
// some code which has to be mocked
}
}
Run Code Online (Sandbox Code Playgroud)
我应该如何模拟对函数" someOtherFoo" 的调用,使其some code在内部不执行" " someOtherFoo?
class someClassTest {
public function someFoo() {
$fixture = $this->getMock('someClass ', array('someOtherFoo'));
$var = "something";
....
// How to mock the call to someOtherFoo() here
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以模拟构造函数,以便它返回我自己构造的函数或变量?
谢谢
我一直在寻找SO和谷歌,但我无法得到明确的答案.
PHPUnit是一个单元测试框架,就像JUnit一样.我使用它,也结合Selenium扩展进行功能测试.浏览时,我看到Behat/Mink不断被提及.但我不完全理解Behat在这里的适用方式.
使用Behat,您可以用人类可读的格式编写场景.然后,Behat可以将其转换为新项目的骨架类吗?但它是否也为单元测试提供了骨架类?你是使用Behat编写单元测试,还是使用PHPUnit/SimpleTest?
但是Behat/Mink确实取代了PHPUnit_Selenium-extension进行功能测试?
您是仅将Behat用于新项目,还是可以适应现有项目?
我有一个使用ServiceB的ClassA.在某种情况下,ClassA最终不应该调用任何ServiceB方法.我现在想测试这个并且确实没有确实调用任何方法.
这可以按如下方式完成:
$classA->expects( $this->never() )->method( 'first_method' );
$classA->expects( $this->never() )->method( 'second_method' );
...
Run Code Online (Sandbox Code Playgroud)
有没有办法简单地说"不应该在这个对象上调用方法"而不是必须为每个方法指定一个限制?
当我运行vendor/bin/phpunit我的测试时,所有运行成功.但是,当我右键单击测试文件并单击"运行测试"时,我最终看到:
/usr/local/bin/php -dxdebug.coverage_enable=1 /private/var/folders/bj/t2w187x158g7rgghctgknwb80000gn/T/ide-phpunit.php --coverage-clover /Users/bkuhl/Library/Caches/WebIde70/coverage/services$tests.coverage --no-configuration /Users/bkuhl/Projects/myproject/services/app/tests
Testing started at 3:09 PM ...
Fatal error: Class IDE_PHPUnit_Framework_TestListener contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (PHPUnit_Framework_TestListener::addRiskyTest) in /private/var/folders/bj/t2w187x158g7rgghctgknwb80000gn/T/ide-phpunit.php on line 504
PHP Fatal error: Class IDE_PHPUnit_Framework_TestListener contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (PHPUnit_Framework_TestListener::addRiskyTest) in /private/var/folders/bj/t2w187x158g7rgghctgknwb80000gn/T/ide-phpunit.php on line 504
Call Stack:
0.0008 340040 1. {main}() /private/var/folders/bj/t2w187x158g7rgghctgknwb80000gn/T/ide-phpunit.php:0
PHP Stack trace:
PHP 1. {main}() …Run Code Online (Sandbox Code Playgroud) 对于类似问题Laravel 5有一个答案:PHPUnit并没有可用的代码覆盖驱动程序,但我安装了xdebug.
(如果我正在使用这个问题:windows7,netbeans8.1,php7,wamp3)
在Netbeans中显示代码覆盖率会导致:
错误:没有可用的代码覆盖率驱动程序
,输出如下:
"C:\ wamp\www\treningPHPUnitSymfony2.8\bin\phpunit.bat"" - colors"" - log-junit""C:\ Users\chiny\AppData\Local\Temp \nb-phpunit-log. xml""--coverage-clover""C:\ Users\chiny\AppData\Local\Temp \nb-phpunit-coverage.xml""C:\ Program Files\NetBeans 8.1\php\phpunit\NetBeansSuite.php"" - ""--run = C:\ wamp\www\treningPHPUnitSymfony2.8\src\TreningBundle\Tests\Controller\RabarbarControllerTest.php"由Sebastian Bergmann和贡献者提供的PHPUnit 5.3.4.
错误:没有可用的代码覆盖率驱动程序
.II 3/3(100%)
时间:1.13秒,内存:4.00MB
好的,但不完整,跳过或有风险的测试!测试:3,断言:1,不完整:2.完成.](网址)
xdebug conf(C:\ wamp\bin\apache\apache2.4.17\bin\php.ini):
[xdebug]
zend_extension ="C:/wamp/bin/php/php7.0.1/zend_ext/php_xdebug-2.4.0rc3-7.0-vc14.dll"
xdebug.remote_enable = off
xdebug.profiler_enable = off
xdebug.profiler_enable_trigger = Off
xdebug.profiler_output_name = cachegrind.out.%t.%p
xdebug.profiler_output_dir ="C:/wamp/tmp"
xdebug.show_local_vars=0
Run Code Online (Sandbox Code Playgroud)
(我在同一个Windows分区中有netbeans和项目目录)
由于该方法withConsecutive将在 PHPUnit 10 中被删除(在 9.6 中已弃用),我需要将此方法的所有出现替换为新代码。
尝试寻找一些解决方案,但没有找到任何合理的解决方案。
例如,我有一个代码
$this->personServiceMock->expects($this->exactly(2))
->method('prepare')
->withConsecutive(
[$personFirst, $employeeFirst],
[$personSecond, $employeeSecond],
)
->willReturnOnConsecutiveCalls($personDTO, $personSecondDTO);
Run Code Online (Sandbox Code Playgroud)
我应该替换哪个代码withConsecutive?
PS官方网站上的文档仍然显示了如何使用withConsecutive
我在测试中有一个模拟对象.现实对象,PageRepository,实现了使用__call()魔术方法,所以如果你调用$ pageRepository-> findOneByXXXX($ value_of_field_XXXX),它会在数据库中搜索该参数匹配的记录.
有没有办法模拟这种方法?
真正的方法调用看起来像这样:
$homepage = $pageRepository->findOneBySlug('homepage');
Run Code Online (Sandbox Code Playgroud)
测试看起来像这样:
$mockPageRepository->expects($this->any())
->method('findOneBySlug')
->will($this->returnValue(new Page()));
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - PHPUnit没有发现方法调用.让它看到方法的唯一方法是在PageRepository中显式定义方法.
我目前有一个问题,我必须在遗留代码中解决,以使我们与PHP扩展的交互正常工作(Singleton测试问题).
因此,我不想在使用应用程序运行常规生产代码时执行此代码.因此,如果正在执行的代码作为测试的一部分执行,我需要检查常规PHP代码.
关于如何确定这个的任何建议?我想到了一个与测试文件本身存在相关的定义变量(我们不会将测试发送给客户),但是我们的开发人员需要Extension才能正常工作,而CI服务器需要运行测试.
是否建议在PHPUnit.xml文件中设置Global?其他想法?
phpunit ×10
php ×8
unit-testing ×4
mocking ×2
testing ×2
bdd ×1
behat ×1
composer-php ×1
deprecated ×1
mink ×1
paradigms ×1
phpstorm ×1
simpletest ×1
symfony ×1
wamp ×1