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