我一直在和这个问题搏斗太久了.我知道我需要跳到一个或另一个,因为它们显然都是可行的/有用的工具,但是已经被困在了几个星期的两个方面.
PHPUnit与PHPSpec - 哪一个可以带来更好的长期可维护性和编程实践?
我已经和几个经验丰富的PHPUnit谈过 - > PHPspec转换/用户现在发誓PHPspec,声称它通过BDD方法促进了更好的设计.但是,由于它是一个更新的工具,与PHPUnit相比缺乏社区/教程.
目前,我的PHP开发主要围绕Laravel 4开发.
在PHPUnit基本上融入Laravel框架的地方,看起来这可能是更容易的选择,但我真的很喜欢PHPSpec的BDD方面.然而,似乎PHPSpec不希望与Laravel的外观设置很好地配合(我也发现这可能是一个很好的做法,以便尽可能避开).
我真正的难题是哪一个更有可能成功地集成到现有的Laravel 4项目中,而现有的测试覆盖率为零.
我有一个早期/简短的尝试将PHPUnit和PHPSpec集成到现有项目中,但实际上只是不确定从哪里开始编写初始测试并最终废弃它们暂时.
我真的想弄清楚从长远来看哪一个可能更值得投入一些时间.
任何经历过两者的人的任何资源/见解都将受到高度赞赏.
有没有人知道从PHPSpec测试生成覆盖率报告的方法?
我想过xdebug,但据我所知它无法为jenkins生成报告.
我刚刚开始学习phpspec以取代PHPUnit.不幸的是,我更喜欢使用PHPStorm编辑器的代码完成功能,这使得即使是PHPUnit的详细模拟界面也可以非常快速地输入.
phpspec没有这样的运气.鉴于这样的类:
<?php
namespace spec\MyVendor\MyClass;
use PhpSpec\ObjectBehavior;
class MyClassSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType('MyVendor\MyClass');
}
function it_should_do_something()
{
$this->???
}
}
Run Code Online (Sandbox Code Playgroud)
首先,shouldHaveType显示'找不到方法'突出显示,其次,如果我尝试自动完成???,我的选项仅限于少数方法ObjectBehaviour.我希望看到的东西一样shouldHaveType,shouldImplement和许多.
我在Github上找到了这个phpspec-stubs存储库,但它似乎只定义了一个方法,并且需要扩展一个包装类.
还有一个PHPStorm插件,但我不清楚这是否应该提供自动完成,并且当前版本在输入任何PHP文件时立即在PHPStorm中给我一个NullPointerException.
那么,你们所有的phpspec用户都打字很多,还是有另一种解决方案?
我目前正在研究我应该用于php的测试框架.我有两个选择是PHPUnit和PHPSpec.我知道PHPUnit是TDD(测试驱动开发),PHPSpec是BDD(行为驱动开发).然而,由于PHPSpec网站缺乏任何真正的PHPSpec教程和有限的文档,我无法得出完整的结论.我向大家提出的问题是,这两个框架之间有哪些相似点和不同之处?是的,BDD和TDD是大的,但还有其他吗?它们看似相似,但没有人详细谈论它们的相似之处.谢谢.
在现代编程工作流程中,一次使用了许多测试框架.例如,在PHP世界中,它实际上是一次使用单元测试,集成测试和功能/验收测试的标准方法.大多数情况下,不同的框架用于不同的测试类型.我使用PHPSpec组合单元,PHPunit用于集成,CodeCeption用于功能测试.
是否有可能聚合每个框架返回的代码覆盖率结果?是否有任何工具可以聚合来自不同框架的代码覆盖率报告? 或者,只有在每个框架不正确时才能查看每个框架的单个结果,因为每个代码覆盖率报告都没有考虑其他测试.
我有一个像下面这样的phpspec类,我只想从中运行一个规范.我想只运行"it_should_do_something_easy".这可能吗?
这是我运行此spec文件的方式:
$> phpspec run spec/Project/WorkerSpec.php
Run Code Online (Sandbox Code Playgroud)
但现在我只想运行一个像"it_should_do_something_easy"这样的规范.
<?php
namespace spec\Project;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
class WorkerSpec
{
public function it_should_do_something_easy()
{
$this->doSomethingEasy()->shouldReturn('Done!');
}
public function it_should_do_something_hard()
{
$this->doSomethingHard()->shouldReturn('Too hard!');
}
}
Run Code Online (Sandbox Code Playgroud) 我想在PHP7中测试标量类型提示和严格类型的示例方法.当我没有传递参数时,该方法应该抛出一个TypeError.PHPSpec返回致命错误:
未捕获的TypeError:参数1传递给Example :: test
<?php
class Example
{
public function test(string $name)
{
$this->name = $name;
}
}
class ExampleSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType('Test\Example');
}
function it_check_test_method_when_not_pass_argument()
{
$this->shouldThrow('\TypeError')->during('test');
}
}
Run Code Online (Sandbox Code Playgroud)
一开始我宣布: declare(strict_types=1);
怎么了?我如何测试投掷TypeError?
我试图使用带有标量值的let函数.我的问题是价格是双倍的,我预计是5.
function let(Buyable $buyable, $price, $discount)
{
$buyable->getPrice()->willReturn($price);
$this->beConstructedWith($buyable, $discount);
}
function it_returns_the_same_price_if_discount_is_zero($price = 5, $discount = 0) {
$this->getDiscountPrice()->shouldReturn(5);
}
Run Code Online (Sandbox Code Playgroud)
错误:
? it returns the same price if discount is zero
expected [integer:5], but got [obj:Double\stdClass\P14]
Run Code Online (Sandbox Code Playgroud)
有没有办法使用let函数注入5?
我正在建立一个新的Laravel项目并整合PHPSpec.我无法找到一个与Laravel整齐合作的phpspec.yml文件的良好工作示例.与Rails中的RSpec类似.
我想要的文件夹结构如下
spec/
models/
controllers/
app/
models/
controllers/
Run Code Online (Sandbox Code Playgroud)
我的phpspec.yml目前看起来像这样:
suites:
controller_suite:
namespace: Controller
spec_path: 'spec/controllers'
src_path: 'app/controllers'
model_suite:
namespace: Model
spec_path: 'spec/models'
src_path: 'app/models'
Run Code Online (Sandbox Code Playgroud)
我在spec/models文件夹中复制了我的模型相关测试,但是当我'phpspec运行'它没有运行它们中的任何一个.我也意识到命名空间不是Laravel中的'Model'和'Controller',也许更像是Eloquent和BaseController.
我也使用这个扩展名:https://github.com/BenConstable/phpspec-laravel
我不知道如何设置它,找不到任何有用的例子.提前致谢!
编辑:来自Jeffrey Way的另一个论坛上的建议:
您可以使用Behat测试您的控制器.PHPSpec不能代替它(或Codeception).
更新:
我已经决定使用Codeception,因为它似乎整齐地集成到Laravel并广泛使用.
我想得到对象的实际返回值而不是可链接对象.
class Foo
{
public $attribute = 'data';
}
class FooSpec extends ObjectBehavior
{
public function it_is_a_test()
{
$attribute = $this->attribute; // I want to get 'data'
}
}
Run Code Online (Sandbox Code Playgroud)
这有什么办法吗?
谢谢.