在我的项目中有一些目录和某些PHP文件的大小非常大,因为我的构建失败了,我想将它们排除在我的 build.xml
问题1 -我是否必须为--ignore="path/filename"项目中的每个php文件编写?
Ques2-有些文件不是php,但.dat我也应该提一下这些文件--ignore吗?
问题3 -我可以指定根据文件大小排除文件,以便排除所有大于500kb的文件吗?
我当前的xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<project name="name-of-project" default="build" basedir=".">
<property name="root.dir" value="${basedir}/.."/>
<property name="source" value="${root.dir}"/>
<target name="clean"
description="Clean up and create artifact directories">
<delete dir="${basedir}/build/api"/>
<delete dir="${basedir}/build/code-browser"/>
<delete dir="${basedir}/build/coverage"/>
<delete dir="${basedir}/build/logs"/>
<delete dir="${basedir}/build/pdepend"/>
<mkdir dir="${basedir}/build/api"/>
<mkdir dir="${basedir}/build/code-browser"/>
<mkdir dir="${basedir}/build/coverage"/>
<mkdir dir="${basedir}/build/logs"/>
<mkdir dir="${basedir}/build/pdepend"/>
</target>
<target name="phpunit"
description="Run unit tests using PHPUnit and generates junit.xml and clover.xml">
<exec executable="phpunit" failonerror="true">
<env key="DOCUMENT_ROOT" value="${source}/api"/>
<env key="MODEL_ROOT" value="${source}/model"/> …Run Code Online (Sandbox Code Playgroud) 当我尝试在IDE PhpStorm中运行PHPUnit测试时,我没有什么问题.
我使用的composer文件看起来像:
{
"require": {
"phpunit/phpunit": "3.7.19"
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行测试时,我会发现异常:
PHP Fatal error: Uncaught exception 'PHPUnit_Framework_Exception' with message 'Class "PHPUnit_Extensions_RepeatedTest" does not extend PHPUnit_Framework_TestCase.'
怎么了?当我加入梨装版本测试工作正常.
// 编辑 示例测试类:
class ReaderTest extends PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function shouldGetReadedValue ()
{
$this->assertTrue(true);
}
}
Run Code Online (Sandbox Code Playgroud)
// EDIT2 跟踪:
/usr/bin/php /tmp/ide-phpunit.php --no-configuration /path/to/my/project
Testing started at 14:53 ...
PHP Fatal error: Uncaught exception 'PHPUnit_Framework_Exception' with message 'Class "PHPUnit_Extensions_RepeatedTest" does not extend PHPUnit_Framework_TestCase.' in /path/to/my/project/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:183
Stack trace:
#0 /path/to/my/project/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php(315): PHPUnit_Framework_TestSuite->__construct(Object(ReflectionClass))
#1 …Run Code Online (Sandbox Code Playgroud) 我这里有一个SymfonyBundle,它实际上不是一个自定义EventDispatcher和一个EventListener.
我如何进行单元测试此代码?
我知道如何为控制器等创建功能测试,但我不确定如何为这个调度程序和监听器编写测试.
有人可以指出我正确的方向,谷歌似乎并没有帮助我在这一方面.
提前致谢.
山姆J.
编辑:04/04/2014:这是我试图创建测试的包
我已经设置了测试来检查是否加载了两个服务(调度程序和监听程序),但现在我需要测试功能性...例如检查在MY调度程序上触发的事件是否在kernel.terinate上的REAL调度程序上触发.
编辑所以我很好地假设我只需要触发我的事件,然后以某种方式进入kernel.terminate,并检查我的事件是否被真正的调度员解雇了,但是如何...
我的项目中有以下结构:
/
/app
/app/models/ --UserTable.php
/lib
/lib/framework
/lib/framework/Models
/lib/framework/Db
/tests -- phpunit.xml, bootstrap.php
/tests/app
/tests/app/models --UserTableTest.php
Run Code Online (Sandbox Code Playgroud)
使用app和lib目录,我有各种类可以一起运行我的应用程序.要设置我的测试,我创建了一个/tests/phpunit.xml文件和/tests/bootstrap.php
phpunit.xml
<phpunit bootstrap="bootstrap.php">
</phpunit>
Run Code Online (Sandbox Code Playgroud)
bootstrap.php中
<?php
function class_auto_loader($className)
{
$parts = explode('\\', $className);
$path = '/var/www/phpdev/' . implode('/', $parts) . '.php';
require_once $path;
}
spl_autoload_register('class_auto_loader');
Run Code Online (Sandbox Code Playgroud)
所以我有以下测试:
<?php
class UserTableTest extends PHPUnit_Framework_TestCase
{
protected $_userTable;
public function setup()
{
$this->_userTable = new app\models\UserTable;
}
public function testFindRowByPrimaryKey()
{
$user = $this->_userTable->find(1);
$this->assertEquals($user->id, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我进行测试时它找不到课程 - PHP Fatal error: Class 'app\models\UserTable' not found …
我们有一台运行PHP 5.3.3的Centos 6.3机器.我不小心卸载了PHPUNIT.我无法再重新安装它.较新的版本不适用于PHP 5.3.3.不幸的是,我无法更新我的PHP版本(公司陷入困境).我如何解决它?
我试过了:
$ wget https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ sudo mv phpunit.phar /usr/local/bin/phpunit
$ phpunit --version
Run Code Online (Sandbox Code Playgroud)
按照建议,它不起作用.
我正在构建一个Laravel包,它Illuminate\Http\Request通过宏注入一个新方法.我正在注入的方法已经完成,预计可以很好地工作,但我也想在发布它之前测试它.
我的测试要求我更改请求的Accept标题,以便我查看测试是否通过.所以我已经完成以下操作来模拟请求:
// package/tests/TestCase.php
namespace Vendor\Package;
use Illuminate\Http\Request;
use Orchestra\Testbench\TestCase as Orchestra;
abstract class TestCase extends Orchestra
{
/**
* Holds the request
* @var Illuminate\Http\Request
*/
protected $request;
/**
* Setup the test
*/
public function setUp()
{
parent::setUp();
$this->request = Request::capture();
$this->request->headers->set('Accept', 'application/x-yaml');
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的测试中,我使用我正在注入的方法Request,$this->request->wantsYaml()并且它始终返回false,因为Accept标头未设置为application/x-yaml.
class RequestTest extends TestCase
{
/** @test */
public function it_should_return_a_bool_if_page_wants_yaml_or_not()
{
dump($this->request->wantsYaml()); // Return false
$this->assertTrue($this->request->wantsYaml()); // …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下命令使用PHPUnit和phpdbg为我的PHP项目生成代码测试覆盖:
phpdbg -dmemory_limit=512M -qrr ./bin/phpunit -c .phpunit.cover.xml
Run Code Online (Sandbox Code Playgroud)
这非常好用:
PHPUnit 6.2.4 by Sebastian Bergmann and contributors.
........ 8 / 8 (100%)
Time: 114 ms, Memory: 14.00MB
OK (8 tests, 13 assertions)
Generating code coverage report in HTML format ... done
Run Code Online (Sandbox Code Playgroud)
但是,当我在docker容器中使用完全相同的命令时:
docker run -it --name YM4UPltmiPMjObaVULwsIPIkPL2bGL0T -e USER=sasan -v "/home/sasan/Project/phpredmin:/phpredmin" -w "/phpredmin" --user "1000:www-data" php:7.0-apache phpdbg -dmemory_limit=512M -qrr ./bin/phpunit -c .phpunit.cover.xml
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
PHPUnit 6.2.4 by Sebastian Bergmann and contributors.
[PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to …Run Code Online (Sandbox Code Playgroud) 我正在尝试在PHPunit中配置Mock对象以返回不同属性的值(使用__get函数访问)
例:
class OriginalObject {
public function __get($name){
switch($name)
case "ParameterA":
return "ValueA";
case "ParameterB":
return "ValueB";
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下方法来模拟:
$mockObject = $this->getMock("OrigionalObject");
$mockObject ->expects($this->once())
->method('__get')
->with($this->equalTo('ParameterA'))
->will($this->returnValue("ValueA"));
$mockObject ->expects($this->once())
->method('__get')
->with($this->equalTo('ParameterB'))
->will($this->returnValue("ValueB"));
Run Code Online (Sandbox Code Playgroud)
但这很可怕:-(
我在PHPUnit中看到的下一个奇怪之处:
class DummyTest extends PHPUnit_Framework_TestCase {
public function testDummy() {
$this->assertTrue(false, 'assert1');
$this->assertTrue(false, 'assert2');
}
public function testDummy2() {
$this->assertTrue(false, 'assert3');
}
}
Run Code Online (Sandbox Code Playgroud)
一旦第一个断言在测试中失败,则忽略测试的其余部分.
所以(通过简单调用phpunit DummyTest.php):
上面的代码将显示2个测试, 2个断言,2个失败.什么?
如果我通过所有测试,那么我会好的(2个测试,3个断言).好.
如果我只通过除assert2之外的所有测试,我得到2个测试,3个断言,1个失败.好.
我不明白,但是PHPUnit已经存在了很长时间,当然它必须是我吗?
计数不仅不是我期望的,而且只显示上面代码中第一个失败断言的错误消息.
(顺便说一句,我正在分析PHPUnit为CI生成的xml格式,而不是测试实际代码,因此在一次测试中实现了多个断言.)
我从开发人员那里继承了一个相当大的,自制的,php4 + MySQL,电子商务项目,他们在写作时自学了编程和html.(我会感到不寒而栗,除非他们能够从头开始做这么多事情,这真是令人印象深刻.)我的工作是保持它并以新功能推进它.
代码的功能取决于$_SESSION数据和其他全局状态结构,然后这些结构会影响代码的流程以及通过require语句显示站点的哪些部分.当我去年接受它时,我的第一个任务是将所有重复内容抽象为单独的文件,这些文件包含在require语句中,并且还从"显示"或输出代码中删除了大部分"逻辑"代码,但我无法删除这一切.我已经将代码转移到了我可以使用的函数中,但这仍然非常有限.类和方法现在肯定是不可能的.
所有测试都是手动/视觉完成的.我想开始自动化一些测试,但我根本不知道从哪里开始.函数的单元测试非常简单,但函数中的代码很少,而且大部分都非常简单.我看phpUnit和DbUnit,但所有的实例以及关于它们的讨论集中在类和方法.
那么,除了项目中最琐碎的部分之外,我还有哪些选项可以开始实施单元测试?