关于php:PHPUnit DataProvider用于symfony2中的功能测试

PHPUnit DataProvider for functional test in symfony2

我正在尝试对以下表单进行功能测试

//快乐场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public function testRegisterActionInvalidCase($password, $confPassword, $gender, $country, $city, $schoo, $schoolName, $shortName, $keyWords, $expectedMessage) {
    $user = $this->_testUtilityService->getRandomEntity($this->_userService, 'FOS\\UserBundle\\Model\\User');
    $token = $user->getConfirmationToken();
    $url = $this->generateUrl('teacher_register', array('token' => $token));
    $crawler = $this->client->request('POST', $url);
    $crawlerResponse = $this->client->getResponse();

    //[ASSERTIONS] Page is loaded ok
    $this->assertEquals(200, $crawlerResponse->getStatusCode());
    //[ASSERTIONS] that the loaded page is the correct one
    $this->assertContains($this->Translator->trans('Teacher Registration'), $this->client->getResponse()->getContent());
    $form = $crawler->selectButton('Save')->form();
    $confPassword = $password = $this->Faker->password();

    if ($gender === 'GENDER') {
        $gender = $this->Faker->randomElement([Gender::FEMALE, Gender::MALE]);
    }
    if ($gender === 'COUNTRY') {
        $country = $this->_testUtilityService->getRandomEntity($this->_countryService, '\\ITJari\\GeneralBundle\\Entity\\Country');
    }
    if ($gender === 'CITY') {
        $city = $this->_testUtilityService->getRandomEntity($this->_cityService, '\\ITJari\\GeneralBundle\\Entity\\City');
    }
    if ($gender === 'SCHOOL') {
        $schoo = $this->_testUtilityService->getRandomEntity($this->_schoolService, '\\ITJari\\SchoolBundle\\Entity\\School');
    }

    // fill in the form to be submitted
    $form["plainPassword['first']"] = $password;
    $form["plainPassword['second']"] = $confPassword;
    $form["gender"] = $gender;
    $form["country"] = $country;
    $form["city"] = $city;
    $form["school"] = $schoo;
    $form["school_name"] = $schoolName;
    $form["short_name"] = $shortName;
    $form["key_words"] = $keyWords;
    $crawler = $this->client->submit($form);
    //[ASSERTIONS] that the form submitted successfully
    $this->assertTrue($crawler->filter('html:contains("Teacher has been created successfully")')->count() > 0);
}

//无效的大小写
如何使用数据提供程序来测试无效案例以进行功能测试?
这是我的尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
 /**
 * @dataProvider provideDataForRegistrationActionInvalidCase
 * @assertions Assert for exception asserted on"exception message"
 *
 */

public function testRegisterActionInvalidCase($password, $confPassword, $gender, $country, $city, $schoo, $schoolName, $shortName, $keyWords, $expectedMessage) {
    $user = $this->_testUtilityService->getRandomEntity($this->_userService, 'FOS\\UserBundle\\Model\\User');
    $token = $user->getConfirmationToken();
    $url = $this->generateUrl('teacher_register', array('token' => $token));
    $crawler = $this->client->request('POST', $url);
    $crawlerResponse = $this->client->getResponse();

    //[ASSERTIONS] Page is loaded ok
    $this->assertEquals(200, $crawlerResponse->getStatusCode());
    //[ASSERTIONS] that the loaded page is the correct one
    $this->assertContains($this->Translator->trans('Teacher Registration'), $this->client->getResponse()->getContent());
    $form = $crawler->selectButton('Save')->form();
    $confPassword = $password = $this->Faker->password();

    if ($gender === 'GENDER') {
        $gender = $this->Faker->randomElement([Gender::FEMALE, Gender::MALE]);
    }
    if ($gender === 'COUNTRY') {
        $country = $this->_testUtilityService->getRandomEntity($this->_countryService, '\\ITJari\\GeneralBundle\\Entity\\Country');
    }
    if ($gender === 'CITY') {
        $city = $this->_testUtilityService->getRandomEntity($this->_cityService, '\\ITJari\\GeneralBundle\\Entity\\City');
    }
    if ($gender === 'SCHOOL') {
        $schoo = $this->_testUtilityService->getRandomEntity($this->_schoolService, '\\ITJari\\SchoolBundle\\Entity\\School');
    }

    // fill in the form to be submitted
    $form["plainPassword['first']"] = $password;
    $form["plainPassword['second']"] = $confPassword;
    $form["gender"] = $gender;
    $form["country"] = $country;
    $form["city"] = $city;
    $form["school"] = $schoo;
    $form["school_name"] = $schoolName;
    $form["short_name"] = $shortName;
    $form["key_words"] = $keyWords;
    $crawler = $this->client->submit($form);
    //[ASSERTIONS] that the form submitted successfully
    $this->assertTrue($crawler->filter('html:contains("Teacher has been created successfully")')->count() > 0);
}

/**
 * @description prepare data to be used as providers for test cases
 * @author Mohamed Ragab Dahab <[email protected]>
 * @access public
 *
 * @covers TeacherService::submitSubscriptionFormData
 *
 * @return array arguments array passed to each test case scenario
 */

public function provideDataForRegistrationActionInvalidCase() {
    [
        //password
        ["password","differentPassword", 'GENDER', 'COUNTRY', 'CITY', 'SCHOOL', 'my school name', 'my short  name', 'my key words', 'password does not match'],
        //Gender
        ["password","password", 'invalid value', 'COUNTRY', 'CITY', 'SCHOOL', 'my school name', 'my short  name', 'my key words', 'Gender invalid value'],
        //Country
        ["password","password", 'GENDER', 'invalid value', 'CITY', 'SCHOOL', 'my school name', 'my short  name', 'my key words', 'Country Invalid value'],
        //City
        ["password","password", 'GENDER', 'COUNTRY', 'invalid value', 'SCHOOL', 'my school name', 'my short  name', 'my key words', 'City Invalid value'],
        //School
        ["password","password", 'GENDER', 'COUNTRY', 'CITY', 'invalid value', 'my school name', 'my short  name', 'my key words', 'School Invalid value'],
        // School Name
        ["password","password", 'GENDER', 'COUNTRY', 'CITY', 'SCHOOL', '112233Invalid Value', 'my short  name', 'my key words', 'School name invalid value'],
        // Short Name
        ["password","password", 'GENDER', 'COUNTRY', 'CITY', 'SCHOOL', 'my school name', '112233Invalid Value', 'my key words', 'Short name invalid value'],
        // Key Words
        ["password","password", 'GENDER', 'COUNTRY', 'CITY', 'SCHOOL', 'my school name', 'my short  name', 'TOO_MUCH_TEXT', 'Too much text'],
    ];
}

但是我不知道如何将表单验证消息分配给使用数据提供者


请记住一些注意事项。

  • 在单元测试期间,切勿返回随机数据的调用方法。因为这样,测试可能会通过一次,然后又失败一次。
  • 不要生成url,而是在测试中对它们进行硬编码。我知道一开始感觉很不对劲,但这实际上是您想要做的事情。例如,如果您有一个公共api,并且"意外地"更改了网址,则测试仍然可以工作,但是依赖于该api的应用程序将停止工作。测试将警告您有关更改,然后您可以查看它是否确实是您想要的。

对于我来说,这些测试通常看起来很复杂。我将其分为2或3个测试。您可以在其他测试中检查页面是否加载正常。另外,如果您需要令牌,用户或用于身份验证的任何内容,我建议您采用某种隐式登录方法。

数据提供者如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    /**
     * Test description
     * @dataProvider getSomeData
     * @param array $data
     */

    public function testSomething($data)
    {
        $test = $data['test'];
        ...
    }

    static function getSomeData()
    {
        return array(
            array('test' => 'a'),
            array('test' => 'b'),
            array('test' => 'c'),
        );
    }

如果您使用phpunit进行功能测试,就可以了,但是请真正考虑使用behat。一旦习惯了,它会变得非常容易。