标签: phpunit

我可以在PHPUnit中"模拟"时间吗?

......不知道'mock'是否是正确的词.

无论如何,我有一个继承的代码库,我正在尝试编写一些基于时间的测试.试图不要模糊,代码与查看项目的历史并确定该项目现在是否基于时间阈值有关.

在某些时候,我还需要测试在该历史记录中添加内容并检查阈值现在是否已更改(显然,更正).

我正在测试的问题是我正在测试的部分代码是使用对time()的调用,所以我发现很难确切知道阈值时间应该是什么,基于我的事实我不确定何时会调用time()函数.

所以我的问题基本上是这样的:有没有办法让我"覆盖"time()调用,或以某种方式"模仿"时间,以便我的测试在"已知时间"工作?

或者我只是必须接受这样一个事实,即我将不得不在我正在测试的代码中执行某些操作,以某种方式允许我强制它在需要时使用特定时间?

无论哪种方式,是否有任何"常见做法"来开发对测试友好的时间敏感功能?

编辑:我的问题的一部分也是历史中发生的事情影响阈值的事实.这是我的部分问题的一个例子......

想象一下,你有一个香蕉,当你需要吃它时,你正试图解决这个问题.假设它将在3天内到期,除非它喷洒了一些化学物质,在这种情况下,我们会在施用喷雾时添加4天到期.然后,我们可以通过冻结它再添加3个月,但是如果它已经冷冻,那么我们只有1天的时间来解冻它.

所有这些规则都是由历史时间决定的.我同意我可以在几秒钟内使用Dominik的测试建议,但我的历史数据是什么?我应该在飞行中"创造"吗?

正如您可能或可能无法分辨的那样,我仍然试图了解所有这些"测试"概念;)

php phpunit

69
推荐指数
5
解决办法
2万
查看次数

如何阅读/改进PHP计算的CRAP指数

我刚开始使用PHPUnit及其丰富的代码覆盖率报告.我理解除了一个之外的所有数字和百分比:CRAP索引.任何人都可以给我一个可靠的解释,它是什么意思,如何分析它以及如何降低它?

php phpunit unit-testing

69
推荐指数
2
解决办法
2万
查看次数

PHPUnit组织测试的最佳实践

我目前要从头开始使用phpunit测试项目.所以我正在研究一些项目(比如Zend),看看他们是如何做的以及他们如何组织他们的测试.

大多数事情都很清楚,只有我遇到的一些问题是如何正确组织测试套件.Zend有一个AllTests.php,从中加载其他测试套件.
艰难地查看它正在使用的类PHPUnit_Framework_TestSuite来创建一个套件对象然后添加其他套件,但如果我查看PHPUnit文档在3.4之后的PHPUnit版本中组织测试,那么只有XML或FileHierarchy的描述.使用类来组织测试的那个被删除了.
我没有发现任何不推荐使用此方法的内容,以及像Zend这样的项目仍在使用它.

但是如果它被弃用,我怎么能用xml配置在相同的结构中组织测试?执行所有测试都没有问题,但如果我只想执行一些测试,我将如何组织测试(在xml中).也许创建几个xmls,我只指定要运行的几个测试/测试套件?

因此,如果我只想测试应用程序的module1和module2,我是否每个都有一个额外的xml,并且仅为那些模块(模块使用的类)定义测试套件.还有一个为所有测试定义测试套件的?

或者@group,在特定测试中使用注释将它们标记为module1或module2 会更好吗?

提前感谢您指出一些最佳做法.

php phpunit

67
推荐指数
2
解决办法
2万
查看次数

使用PHPUnit模拟私有方法

我有一个关于使用PHPUnit模拟类中的私有方法的问题.让我举一个例子:

class A {
  public function b() { 
    // some code
    $this->c(); 
    // some more code
  }

  private function c(){ 
    // some code
  }
}
Run Code Online (Sandbox Code Playgroud)

如何将私有方法的结果存根以测试公共函数的更多代码部分.

解决了部分阅读在这里

php phpunit mocking

66
推荐指数
8
解决办法
7万
查看次数

如何测试PHPUnit模拟对象中的第二个参数

这就是我所拥有的:

$observer = $this->getMock('SomeObserverClass', array('method'));
$observer->expects($this->once())
         ->method('method')
         ->with($this->equalTo($arg1));
Run Code Online (Sandbox Code Playgroud)

但该方法应该采用两个参数.我只测试第一个参数正确传递($ arg1).

如何测试第二个参数?

php phpunit

64
推荐指数
1
解决办法
3万
查看次数

使用Composer和autoload.php在PHPUnit中自动加载类

我刚刚通过Composer安装了Sebastian Bergmann的PHPUnit版本3.7.19,并编写了一个我想进行单元测试的课程.

我想让我的所有课程自动加载到每个单元测试中,不必使用includerequire在我的测试的顶部,但这证明是困难的!

这是我的目录结构的样子(尾部/斜杠表示目录,而不是文件):

  • composer.json
  • composer.lock
  • composer.phar
  • LIB /
    • returning.php
  • 测试/
    • returningTest.php
  • 供应商/
    • 斌/
      • PHPUnit的
    • 作曲家/
    • PHPUnit的/
    • symfony的/
    • autoload.php

我的composer.json文件包括以下内容:

"require": {
    "phpunit/phpunit": "3.7.*",
    "phpunit/phpunit-selenium": ">=1.2"
}
Run Code Online (Sandbox Code Playgroud)

我的returns.php类文件包括以下内容:

<?php
class Returning {
    public $var;
    function __construct(){
        $this->var = 1;
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

我的returnsTest.php测试文件包括以下内容:

<?php
class ReturningTest extends PHPUnit_Framework_TestCase
{
    protected $obj = null;

    protected function setUp()
    {
        $this->obj = new Returning;
    }

    public function testExample()
    {   
        $this->assertEquals(1, $this->obj->var); …
Run Code Online (Sandbox Code Playgroud)

php phpunit namespaces autoload composer-php

63
推荐指数
4
解决办法
6万
查看次数

如何测试字符串是否包含PHPUnit中的另一个字符串?

我似乎无法在PHPUnit中找到一个断言,只是测试一个字符串是否包含在另一个字符串中的某个地方.试着这样做:

public function testRecipe() {

    $plaintext = get_bread_recipe();

    $this->assertStringContains('flour', $plaintext);

}
Run Code Online (Sandbox Code Playgroud)

我会用什么真正的断言而不是assertStringContains?在这种情况下,我宁愿不必担心正则表达式,因为绝对不需要它.

这很简单,必须有一些我忽略的东西,但我无法理解!有趣的是assertStringStartsWith(),有assertStringEndsWith()!

更新:我知道strpos() !== false可以使用,但我正在寻找更清洁的东西.如果我只是使用vanilla PHP函数,那么所有断言的重点是什么......

php phpunit

61
推荐指数
3
解决办法
3万
查看次数

PHPUnit:如何创建一个为我的所有测试调用一次的函数?

我有一个PHPUnit测试用例类(包含一些测试函数).我想oneTimeSetUp()为类中的所有测试编写一个函数来调用一次(不像标准setUp()函数,在类中为每个测试调用一次).换句话说,我正在寻找一个等效于JUnit @BeforeClass注释的PHPUnit .

oneTimeTearDown()功能相同的问题.

是否有可能在PHPUnit中这样做?

php phpunit

59
推荐指数
5
解决办法
3万
查看次数

如何将PHPUnit与CodeIgniter一起使用?

我已阅读和阅读有关PHPUnit,SimpleTest和其他单元测试框架的文章.它们听起来都很棒!我终于让PHPUnit与Codeigniter一起工作,感谢https://bitbucket.org/kenjis/my-ciunit/overview

现在我的问题是,我该如何使用它?

我看到的每个教程都有一些抽象的用法,如assertEquals(2, 1+1):

public function testSpeakWithParams()
{
    $hello = new SayHello('Marco');
    $this->assertEquals("Hello Marco!", $hello->speak());
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个输出这样一个可预测字符串的函数,那就太好了.通常我的应用程序从数据库中获取大量数据,然后在某种表中显示它.那么我该如何测试Codeigniter的控制器呢?

我想做测试驱动开发,我已经阅读了关于PHPUnits网站的教程,但是这个例子再一次看起来很抽象.我的大多数codeigniter函数都在显示数据.

是否有一本书或一本有实际应用的精彩教程和PHPUnit测试的例子?

php phpunit unit-testing codeigniter

58
推荐指数
1
解决办法
2万
查看次数

Laravel 5:PHPUnit并且没有可用的代码覆盖驱动程序

我想使用PHPUnit来创建代码覆盖率报告.我已尝试在网上找到很多安装设置.但似乎没有任何结果.

我使用最新版本的Laravel 5(> 5.2)和PHPUnit v.5.0.10.此外,我在运行PHP 7的Mac OS X 10.9.5上使用MAMP.

当我运行集成在Laravel发行版中的PHPUnit时,我收到以下错误.

$ vendor/bin/phpunit -v
PHPUnit 5.0.10 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.0
Configuration: /Applications/MAMP/htdocs/myProject/phpunit.xml
Error:         No code coverage driver is available`
Run Code Online (Sandbox Code Playgroud)

我的作曲家文件看起来像:

"require-dev": {
    "fzaninotto/faker": "~1.4",
    "mockery/mockery": "0.9.*",
    "phpunit/phpunit": "5.0.*",
    "phpunit/php-code-coverage": "^3",
    "symfony/css-selector": "2.8.*|3.0.*",
    "symfony/dom-crawler": "2.8.*|3.0.*"
},
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下命令:

/Applications/MAMP/bin/php/php7.0.0/bin/phpdbg -qrr ../../../htdocs/myProject/vendor/bin/phpunit -v
Run Code Online (Sandbox Code Playgroud)

这似乎很好地设置了代码覆盖率驱动程序,但最终会出现异常:

$ /Applications/MAMP/bin/php/php7.0.0/bin/phpdbg -qrr ../../../htdocs/myProject/vendor/bin/phpunit -v
PHPUnit 5.0.10 by Sebastian Bergmann and contributors.

Runtime:       PHPDBG 7.0.0
Configuration: /Applications/MAMP/htdocs/myProject/phpunit.xml

[PHP Fatal error:  Uncaught ErrorException: include(/Applications/MAMP/htdocs/myProject/app/Exceptions/Handler.php): failed to open …
Run Code Online (Sandbox Code Playgroud)

phpunit code-coverage laravel-5.2

58
推荐指数
6
解决办法
5万
查看次数