标签: phpunit

使用git和submodule,什么是好的文件夹结构?

我使用git和子模块,我很难弄清楚如何组织我的文件.我用PHP开发,并使用单元测试.所以现在,我为每个模块使用这个组织:

  • SRC /
  • 测试/

这似乎是个好主意,但问题是,当我对项目执行"git submodule add"时,我将拥有该路径:project/modules/News/src/index.php

src /文件夹确实存在问题.

我应该简单地将所有文件放在模块根目录中,并在源代码中混合使用测试/文件夹吗?对我来说听起来很糟糕.你在做什么 ?

编辑:由于自动加载,src /文件夹有问题.我不应该把"src"放在我所有的班级名字中......

php git phpunit project-organization

8
推荐指数
1
解决办法
2306
查看次数

有没有办法控制Codeception中的测试顺序?

经过多年编写单元测试后,我才开始使用CodeceptionPHPUnit.有一件事让我烦恼,我无法找到一种方法来控制调用测试的顺序.

在纯旧的PHPUnit我手动构建测试结构,如下所示:

$suite = new PHPUnit_Framework_TestSuite();
$suite->addTest('MyFirstTest');
$suite->addTest('MySecondTest');
Run Code Online (Sandbox Code Playgroud)

并且将按照它们添加到套件中的顺序调用测试.Codeception另一方面,似乎是在遍历目录并运行它可以找到的每个测试.

我希望能够在两个级别上控制测试的顺序:

  1. 在不同类型的测试被调用的顺序(即我想运行unit tests之前acceptance tests)
  2. 我想控制在特定测试类型中调用的测试顺序(与PHPUnit构建套件类似)

广告.2:假设我在acceptance目录中有两个测试:

AbcCept.php
WebGuy.php
XyzCept.php
Run Code Online (Sandbox Code Playgroud)

我希望能够运行XyzCept.php之前AbcCept.php.这甚至可能吗?

并且预测挑剔的评论:是的,我知道测试应该能够以任何顺序运行,而不是彼此依赖,但这不是我要求的.

php phpunit codeception

8
推荐指数
1
解决办法
2871
查看次数

phpunit -coverage-html报告路径

我试图用xdebug执行phpunit代码覆盖,如下所示,

C:\wamp\bin\php\php5.3.22>phpunit -coverage-html /tmp C:\<unittest file pat>\TestRetainer.php
Run Code Online (Sandbox Code Playgroud)

它输出如下,

PHPUnit 3.7.32 by Sebastian Bergmann.

....

Time: 36 ms, Memory: 5.75Mb

OK (4 tests, 12 assertions)

C:\wamp\bin\php\php5.3.22>
Run Code Online (Sandbox Code Playgroud)

但我无法找到报告文件的html版本.

我已经浏览了这个网址http://phpunit.de/manual/current/en/phpunit-book.html#code-coverage-analysis.但我没有找到任何运气.

请帮帮我.

phpunit unit-testing xdebug xdebug-profiler

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

不使用PHPUnit测试受保护/私有方法时的代码覆盖率

我知道可以使用反射或其他解决方法使用PHPUnit测试私有/受保护的方法.

但是大多数消息来源告诉我,在类中编写私有方法的测试并不是最好的做法.

您应该将类​​测试为"黑盒子" - 您只需通过将输入与输出进行比较而不考虑内部机制来测试预期行为.编写类的测试还应通过显示缺少代码覆盖率来通知您未使用的私有方法.

当我测试我的类并生成HTML报告时,它会显示测试未涵盖的私有方法,即使它们被调用的行是绝对执行/覆盖的.我知道私有方法被执行,因为如果它们不是我班上的断言就不会通过.

这是PHPUnit中的预期行为吗?我是否可以争取100%的覆盖率,同时仅间接测试私有方法?

一些简化的示例代码(在Symfony2中使用RestBundle):

class ApiController extends FOSRestController {

/*
 * @REST\View()
 * @REST\Get("/api/{codes}")
 */
public function getCodesAction($codes) {
    $view = new View();
    $view->setHeader('Access-Control-Allow-Origin', '*');
    $view->setData(array('type' => 'codes','data' => $this->_stringToArray($codes)));
    $view->setFormat('json')->setHeader('Content-Type', 'application/json');
    return $this->handleView($view);
}

private function _stringToArray($string){
    return explode('+',$string);
}
Run Code Online (Sandbox Code Playgroud)

公共函数显示为"覆盖",私有函数是间接覆盖的,但在PHPUnit报告中显示为红色.

测试:

class ApiControllerTest extends WebTestCase {

    public function test_getCodesAction(){
        $client = static::createClient();
        $client->request('GET', '/api/1+2+3');
        $this->assertContains('{"type": "codes", "data": [1,2,3]}', $client->getResponse()->getContent());
    }

}
Run Code Online (Sandbox Code Playgroud)

这当然是一个愚蠢的例子,我也可以在公共函数中包含explode(); 但我正在编写的控制器包含更多复杂且可重复使用的私有函数,这些函数以更复杂的方式转换数据(但仍然没有副作用).

php phpunit unit-testing code-coverage

8
推荐指数
1
解决办法
2349
查看次数

控制器单元测试在slim3

首先,我想说 - 我是用PHP(phpunit)进行单元测试的新手.在我的新项目(slim3框架)中,我想测试我的控制器,例如LoginController.

我的想法是(在单元测试方法中)

  • 创建实例 LoginController
  • 在控制器(DI)中模拟一些服务
  • 作为请求响应的执行方法(在我的控制器方法中__invoke)

我的问题是关于__invoke方法的参数.在Slim3中,可调用的请求方法有两个第一个参数:

RequestInterface $requestResponseInterface $response

如何在单元测试类中创建此参数?我正在寻找这个问题的一些例子,但没有成功.

有什么建议?

我在Slim3测试中发现了一些模拟请求的代码:

protected function requestFactory()
{
    $uri = Uri::createFromString('https://example.com:443/foo/bar?abc=123');
    $headers = new Headers();
    $cookies = array(
        'user' => 'john',
        'id' => '123',
    );
    $env = Slim\Http\Environment::mock();
    $serverParams = $env->all();
    $body = new Body(fopen('php://temp', 'r+'));
    $request = new Request('GET', $uri, $headers, $cookies, $serverParams, $body);

    return $request;
}
Run Code Online (Sandbox Code Playgroud)

但我不确定这是好方法.

谢谢你的帮助

phpunit slim slim-3

8
推荐指数
1
解决办法
4091
查看次数

Laravel测试不验证数据库约束

我有一个包含users表格的Laravel 5.3应用程序.该表上的一个字段是api_token,在数据库定义中设置为NOT NULL.如果我使用Postman并点击我的API端点来创建用户并且不包含该api_token字段,则会收到以下错误:SQLSTATE[HY000]: General error: 1364 Field 'api_token' doesn't have a default value.

我还没有添加代码来生成令牌,所以这正是我所期望的.但是,我有这个PHPUnit测试:

/** @test */
public function a_user_can_be_created()
{
    $this->user_data = [
        'first_name' => 'Jane',
        'last_name' => 'Smith',
        'email_address' => 'jsmith@mailinator.com',
        'phone' => '1234567890',
        'username' => 'jsmith',
        'password' => 'testing'
    ];

    $this->post('/api/users', $this->user_data, array(
                'Accept' => 'application/json'
            ))
         ->assertResponseStatus(201)
         ->seeJsonEquals(['status' => 'success'])
         ->seeInDatabase('users', $this->user_data);
}
Run Code Online (Sandbox Code Playgroud)

问题是测试通过了.当用户保存数据库时应该抛出异常,该测试如何成功?

我已经在不同时间点"死亡并倾倒"并确认在自动化测试运行时数据实际上已保存到数据库中.我也尝试使用相同的数据库进行Postman和自动测试(而不是单独的测试数据库) - 相同的结果.

phpunit laravel laravel-5

8
推荐指数
2
解决办法
772
查看次数

Laravel 5.4上的示例PHPUnit测试失败,带有404

我可以通过link:localhost:8888/streaming_statistic/public在Laravel 5.4上创建我的项目

我有一个测试:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ApiTest extends TestCase
{
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}
Run Code Online (Sandbox Code Playgroud)

我用命令运行所有测试

./vendor/bin/phpunit
Run Code Online (Sandbox Code Playgroud)

但结果是:

PHPUnit 5.7.13 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 222 ms, Memory: 12.25MB

There was 1 failure:

1) Tests\Feature\ApiTest::testBasicTest
Expected status code 200 but received 404.
Failed asserting that false is true.

/Applications/MAMP/htdocs/streaming_statistic/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:56
/Applications/MAMP/htdocs/streaming_statistic/tests/Feature/ApiTest.php:16

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Run Code Online (Sandbox Code Playgroud)

我可以打开这个页面http:// localhost:8888/streaming_statistic/public …

php testing phpunit laravel-5 laravel-5.4

8
推荐指数
1
解决办法
5602
查看次数

Laravel 5.4; 如何从Laravel包中运行单元测试?

我正在尝试开发一个Laravel编写器包并从中运行单元测试.在过去几天阅读各种过时且矛盾的指南和博客后,我对如何解决这个问题感到困惑.

这是我目前所知道的:

  • 我不应该从主要的Laravel安装中运行测试.测试应该都包含在包中.我承认这有一定的逻辑.
  • 有一种叫做Orchestra Testbench的东西.如果您正在开发Laravel包,那么显然您应该使用它.
  • 还有一种名为Laravel Dusk的东西,包含在Laravel 5.4中.

我可以让Orchestra Test Bench从给出的示例中进行一些基本测试,但我并不真正理解发生了什么,文档几乎没有解释.在测试我的应用程序的路由时,我无法获得任何工作.

我不明白Orchestra和Dusk是否可以一起玩,或者我必须在它们之间做出选择.如果是这样,我应该使用哪一个?如果它是我应该使用的Laravel Dusk,那么如何在我的包目录中运行它?

phpunit unit-testing laravel-5 laravel-dusk

8
推荐指数
2
解决办法
2150
查看次数

如何单元测试FilePostRedirectGet插件?

TLDR:

如何为FilePostRedirectGet表单提交请求编写集成测试?


在我的应用程序中,我有一个多页面的表单,里面有一个文件元素.最初控制器代码是(伪代码 - 删除所有多页面内容):

$form = new MyForm();
if($this->getRequest()->isPost()) {
  if($form->isValid($this->getRequest()->getPost()) {
    //move file to new home and save post to database.
    return $this->redirect()->toRoute('admin/cms/edit');
  }
}
return new ViewModel(['form' => $form]);
Run Code Online (Sandbox Code Playgroud)

基本上,如果表单有效,它将保存表单详细信息并执行重定向(通常是页面的编辑版本).如果表单无效,它将仅使用相应的错误消息再次显示该表单.

这种方法的问题是,如果其中一个表单元素未通过验证,则文件输入将失去其值,用户将需要重新上载其文件.为了解决这个问题,我改为FPRG方法:

$form = new MyForm();
/* @var $prg FilePostRedirectGet */
$prg = $this->filePostRedirectGet($form, $this->url()->fromRoute($this->routeMatch, ['action' => $this->action, 'id' => $id], ['query' => ['page' => $page]]), true);
if ($prg instanceof Response) {
  return $prg; // Return PRG redirect response
} elseif ($prg !== false) {
    //move …
Run Code Online (Sandbox Code Playgroud)

plugins phpunit unit-testing zend-framework2

8
推荐指数
0
解决办法
170
查看次数

Laravel 5.8 .env.testing文件不起作用

我使用凭据创建了一个.env.testing文件,除了数据库的表名称不同之外,其他所有内容都与.env相同。

我尝试php artisan config:clear删除其中的缓存配置文件bootstrap/cache/config.php,但它断开了数据库连接。如果我通过运行php artisan config:cache缓存的文件重新缓存文件,则返回该文件,但是.env.testing文件中没有凭据。当我重新运行PHPUnit时,它将连接到错误的数据库,该数据库名称存储在.env中,而不是.env.testing中。

这是真的吗?最新的Laravel版本是否破坏了测试环境?

这是文档的内容:(位于此处:https : //laravel.com/docs/5.8/testing

“您可以根据需要自由定义其他测试环境配置值。可以在phpunit.xml文件中配置测试环境变量,但是请确保在运行测试之前使用config:clear Artisan命令清除配置缓存!

另外,您可以在项目的根目录中创建一个.env.testing文件。运行PHPUnit测试或使用--env = testing选项执行Artisan命令时,此文件将覆盖.env文件。”

更新

我终于能够通过在phpunit.xml文件中添加数据库覆盖来覆盖.env中声明的数据库;.env.testing仍然无法正常工作。这些文档至少具有误导性。

testing phpunit laravel

8
推荐指数
4
解决办法
1060
查看次数