......不知道'mock'是否是正确的词.
无论如何,我有一个继承的代码库,我正在尝试编写一些基于时间的测试.试图不要太模糊,代码与查看项目的历史并确定该项目现在是否基于时间阈值有关.
在某些时候,我还需要测试在该历史记录中添加内容并检查阈值现在是否已更改(显然,更正).
我正在测试的问题是我正在测试的部分代码是使用对time()的调用,所以我发现很难确切知道阈值时间应该是什么,基于我的事实我不确定何时会调用time()函数.
所以我的问题基本上是这样的:有没有办法让我"覆盖"time()调用,或以某种方式"模仿"时间,以便我的测试在"已知时间"工作?
或者我只是必须接受这样一个事实,即我将不得不在我正在测试的代码中执行某些操作,以某种方式允许我强制它在需要时使用特定时间?
无论哪种方式,是否有任何"常见做法"来开发对测试友好的时间敏感功能?
编辑:我的问题的一部分也是历史中发生的事情影响阈值的事实.这是我的部分问题的一个例子......
想象一下,你有一个香蕉,当你需要吃它时,你正试图解决这个问题.假设它将在3天内到期,除非它喷洒了一些化学物质,在这种情况下,我们会在施用喷雾时添加4天到期.然后,我们可以通过冻结它再添加3个月,但是如果它已经冷冻,那么我们只有1天的时间来解冻它.
所有这些规则都是由历史时间决定的.我同意我可以在几秒钟内使用Dominik的测试建议,但我的历史数据是什么?我应该在飞行中"创造"吗?
正如您可能或可能无法分辨的那样,我仍然试图了解所有这些"测试"概念;)
我刚开始使用PHPUnit及其丰富的代码覆盖率报告.我理解除了一个之外的所有数字和百分比:CRAP索引.任何人都可以给我一个可靠的解释,它是什么意思,如何分析它以及如何降低它?
我目前要从头开始使用phpunit测试项目.所以我正在研究一些项目(比如Zend),看看他们是如何做的以及他们如何组织他们的测试.
大多数事情都很清楚,只有我遇到的一些问题是如何正确组织测试套件.Zend有一个AllTests.php,从中加载其他测试套件.
艰难地查看它正在使用的类PHPUnit_Framework_TestSuite来创建一个套件对象然后添加其他套件,但如果我查看PHPUnit文档在3.4之后的PHPUnit版本中组织测试,那么只有XML或FileHierarchy的描述.使用类来组织测试的那个被删除了.
我没有发现任何不推荐使用此方法的内容,以及像Zend这样的项目仍在使用它.
但是如果它被弃用,我怎么能用xml配置在相同的结构中组织测试?执行所有测试都没有问题,但如果我只想执行一些测试,我将如何组织测试(在xml中).也许创建几个xmls,我只指定要运行的几个测试/测试套件?
因此,如果我只想测试应用程序的module1和module2,我是否每个都有一个额外的xml,并且仅为那些模块(模块使用的类)定义测试套件.还有一个为所有测试定义测试套件的?
或者@group,在特定测试中使用注释将它们标记为module1或module2 会更好吗?
提前感谢您指出一些最佳做法.
我有一个关于使用PHPUnit模拟类中的私有方法的问题.让我举一个例子:
class A {
public function b() {
// some code
$this->c();
// some more code
}
private function c(){
// some code
}
}
Run Code Online (Sandbox Code Playgroud)
如何将私有方法的结果存根以测试公共函数的更多代码部分.
解决了部分阅读在这里
这就是我所拥有的:
$observer = $this->getMock('SomeObserverClass', array('method'));
$observer->expects($this->once())
->method('method')
->with($this->equalTo($arg1));
Run Code Online (Sandbox Code Playgroud)
但该方法应该采用两个参数.我只测试第一个参数正确传递($ arg1).
如何测试第二个参数?
我刚刚通过Composer安装了Sebastian Bergmann的PHPUnit版本3.7.19,并编写了一个我想进行单元测试的课程.
我想让我的所有课程自动加载到每个单元测试中,而不必使用include或require在我的测试的顶部,但这证明是困难的!
这是我的目录结构的样子(尾部/斜杠表示目录,而不是文件):
我的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) 我似乎无法在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函数,那么所有断言的重点是什么......
我有一个PHPUnit测试用例类(包含一些测试函数).我想oneTimeSetUp()为类中的所有测试编写一个函数来调用一次(不像标准setUp()函数,在类中为每个测试调用一次).换句话说,我正在寻找一个等效于JUnit @BeforeClass注释的PHPUnit .
与oneTimeTearDown()功能相同的问题.
是否有可能在PHPUnit中这样做?
我已阅读和阅读有关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测试的例子?
我想使用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 ×10
php ×9
unit-testing ×2
autoload ×1
codeigniter ×1
composer-php ×1
laravel-5.2 ×1
mocking ×1
namespaces ×1