PHPUnit:更好的方法来测试执行CRUD操作的REST API

时间:2017-11-22 12:21:19

标签: php rest api unit-testing phpunit

我创建了一个REST API,它在DB上执行CRUD操作并从DB返回结果。现在,这是我的下面的代码:

class CreateRecords
{
    public function createEntities($details)
    {
        if (trim($details['username']) == "") {
            $this->result = "Username is empty.";
        } else {
            $this->result = create_record($userDetails);
        }       
        return $this->result;
    }
}

这里,在上面的代码中,create_record是一个函数,它执行验证部分并将详细信息插入到db中,并返回新创建的记录的id。

现在,我的测试用例如下:

class TestCreateRecords
{   
    public function setUp()
    {
        $this->client = new GuzzleHttp\Client([
                'base_uri' => 'http://localhost/test/'
            ]);
    }

    public function testCreateEntitiesAPI()
    {           
        $response = $this->client->post('service.php', [
            'json' => [
                'username' => 'test@test.com',
                'user_password' => 'test',
                'first_name' => 'Test',
                'last_name' => 'test',
                'email1' => 'test@test.com'
            ]
        ]);

        $actual_response = json_decode($response->getBody(), true);

        $this->assertArrayHasKey("id", $actual_response, 'Un-successful.');
    }
}

所以,我对此几乎没有疑问:

  1. 在我的主类文件中,create_record函数在将详细信息插入数据库之前验证username。它会检查username是否已经可用。如果可用,它将不会创建记录并将响应发送为Already Available。如果不可用,则它将创建一条记录并发送新创建的唯一ID。

    现在,我想测试这两种情况,其中传递username已在DB中可用而在DB中不可用。现在,在上面的测试用例中,每次运行测试之前我都必须对其进行更改,因此我可以测试方案,其中username在DB中已经不可用。这对我来说似乎不合逻辑。

    我想知道,还有其他方法可以实现这个目标吗?

  2. 有人建议我嘲笑create_record方法来测试API并编写另一个测试用例来测试create_record方法本身。但根据我的应用程序MVC框架,我现在似乎不可能。因为在create_record方法中,有许多方法被调用,这些方法只调用其他方法。而且,我将不得不嘲笑那些数十种方法并为它们编写测试用例等等。

    这对我们来说耗费时间和精力。所以我决定不在一个测试用例中模拟任何方法并测试整个API流程。

    我想知道,这是一个好方法吗?它的副作用是什么?

1 个答案:

答案 0 :(得分:1)

建议你尝试嘲笑的人是对的。很高兴你想开始测试更多,但它经常会在应用程序架构中出现问题。

单元测试最好只测试一个类或函数。如果您的所有函数都在调用其他函数一直到数据库插入,则它是一个端到端的测试。有这些可以,但在你的情况下,你想测试各种情况(当验证失败,因为存在用户名),你很快就会发现在端到端测试中测试所有边缘情况是

您已经有connect(&objectA, SIGNAL(MySignal()), &objectA, SLOT(MySlot())); 课程。在CreateRecords类中使用了哪里?如果您正在使用某种依赖注入,您可以模拟控制器中的service.php类(我猜测它是CreateRecords。这样您就可以与API分开测试服务代码。这是一个例子:

service.php

然后,您可以创建仅测试每个图层的测试,例如

  • 如果不是管理员
  • ,则检查API是否会引发异常的测试
  • 许多用于用户验证的不同单元测试
  • 在UserService中进行用户创建的一些测试(模拟验证器和记录保护程序)