PHPUnit DataProvider для функционального тестирования в symfony2

Я пытаюсь выполнить функциональный тест в форме следующим образом

// счастливый сценарий

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);
}

//недопустимый случай Как я могу использовать поставщик данных для проверки недопустимого случая для функционального теста? вот моя попытка:

 /** 
 * @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'],
    ];
}

однако я не знаю, как назначить сообщение проверки формы для использования поставщика данных


person Dahab    schedule 05.04.2015    source источник


Ответы (1)


Несколько замечаний для вас, чтобы иметь в виду.

  • Никогда во время модульного тестирования не вызывайте методы, которые возвращают случайные данные. Потому что таким образом может случиться так, что тесты пройдены один раз, а другой раз не пройдены.
  • Не создавайте URL-адреса, а жестко кодируйте их в своих тестах. Я знаю, что поначалу это кажется неправильным, но на самом деле это то, чем вы хотите заниматься. Например, если у вас есть общедоступный API, и вы «случайно» изменили URL-адрес, тесты все равно будут работать, но приложения, использующие API, перестанут работать. Тест предупредит вас об изменении, и тогда вы сможете увидеть, действительно ли это то, что вы хотели.

Тесты кажутся мне сложными в целом. Я бы разделил на 2-3 теста. Вы можете проверить, нормально ли загрузилась страница, в другом тесте. Кроме того, я бы посоветовал вам создать какой-то неявный метод входа в систему, если вам нужен токен, пользователь или что-то еще для вашей аутентификации.

Поставщики данных выглядят следующим образом:

    /**
     * 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. Это намного проще, как только вы привыкнете к этому.

person tomazahlin    schedule 05.04.2015