使用LiipFunctionalTestBundle和灯具进行独立的功能测试?

时间:2015-02-18 13:06:04

标签: symfony doctrine-orm phpunit functional-testing liipfunctionaltestbundle

我正在为Symfony2项目添加测试。以前我在devtest环境中使用了相同的数据库,它使用的MySQL数据库已经填充了与生产服务器相同的数据。

测试依赖于工作,因为一些测试取决于之前的测试。例如,如果我有一个商店网站,我在购物车中添加了一个产品,然后从购物车中删除了产品。所以我需要使用表单插入数据,然后才能将其删除。

现在我想使用独立的功能测试,因为它是recommended way (by one of Symfony2's developers)

我已正确配置LiipFunctionalTestBundle以在test环境中使用SQLite数据库,并且我已开始使用DoctrineFixturesBundle添加灯具。

但我不知道每次功能测试需要加载多少数据。我应该在测试开始时加载什么夹具?当实体因表之间的关系而依赖于其他实体时,如何处理CRUD操作?

我们说我正在开发一家商店,我想要一些测试:

  1. 用户在购物车中添加一些产品
  2. 用户从购物车中删除一件商品
  3. 用户订购剩余产品
  4. 我应该为每一步创建不同的灯具吗?这意味着我的灯具需要存在于许多不同的状态:空车,订购一种产品的推车等等。这对我来说似乎是正确的,但非常耗时,所以我想知道我的想法是否有效。

1 个答案:

答案 0 :(得分:2)

对于每个测试用例,最好尽可能地减少夹具的隔离和性能(测试套件可以非常缓慢)。

当夹具相互依赖时,您只需使用学说参考管理它们并相互链接,同时也要处理订单。 例如,假设只是用户和角色关系。

管理角色夹具的通用类:

abstract class BaseLoadRoleData extends AbstractFixture implements OrderedFixtureInterface
{


    public function getOrder()
    {
        return 1;
    }

    protected function createRole(ObjectManager $manager, $rolename)
    {
        $role= new Role();
        $role->setName($rolename);

        $manager->persist($role);
        $manager->flush();
        $this->setReference('role-' . $rolename, $role);
    }
}

简单角色的专用课

class LoadSimpleRoleData extends BaseLoadRoleData
{
    public function load(ObjectManager $manager)
    {
        $this->createRole($manager, Role::SIMPLE);
    }
}

管理员角色的专用课程

class LoadAdminRoleData extends BaseLoadRoleData
{
    public function load(ObjectManager $manager)
    {
        $this->createRole($manager, Role::ADMIN);
    }

}

用户: 管理用户夹具的通用类:

abstract class BaseLoadUserData extends AbstractFixture implements OrderedFixtureInterface
{

    /**
     * @var ContainerInterface
     */
    private $container;

    /**
     * {@inheritDoc}
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function getOrder()
    {
        return 2;
    }

    protected function buildUser($username, $firstName = "",$lastName ="")
    {
        $user= new User();
        $user->setUsername($username);
        $user->setFirstName($firstName);
        $user->setLastName($lastName);

        return $user;

    }
}

简单用户的专用课程

class LoadSimpleUserData extends BaseLoadUserData {

    /**
     * Load data fixtures with the passed EntityManager
     *
     * @param Doctrine\Common\Persistence\ObjectManager $manager
     */
    function load(ObjectManager $manager)
    {
        $user = $this->buildUser($manager, "simple@example.com");
        $user->addRole($this->getReference('role-'.Role::SIMPLE));
        $manager->persist($user);
        $manager->flush();
        $this->setReference('user-' . "admin@example.com", $user);

    }
}

管理员用户的专用课程

class LoadAdminUserData extends BaseLoadUserData {

    /**
     * Load data fixtures with the passed EntityManager
     *
     * @param Doctrine\Common\Persistence\ObjectManager $manager
     */
    function load(ObjectManager $manager)
    {
        $user = $this->buildUser($manager, "admin@example.com");
        $user->addRole($this->getReference('role-'.Role::ADMIN));
        $manager->persist($user);
        $manager->flush();
        $this->setReference('user-' . "admin@example.com", $user);

    }

现在您可以单独使用它,例如,基于Liip功能测试包:

class LoginControllerTest {

    public function testAdminUserLogin()
    {
        $this->loadFixtures(array(
            'Acme\DemoBundle\DataFixtures\ORM\LoadAdminRoleData',
            'Acme\DemoBundle\DataFixtures\ORM\LoadAdminUserData'
        ));

        // you can now run your functional tests with a populated database
        $client = static::createClient();
        // ...

        // test the login with admin credential
    }

    public function testSimpleUserLogin()
    {
        // add all your fixtures classes that implement
        // Doctrine\Common\DataFixtures\FixtureInterface
        $this->loadFixtures(array(
            'Acme\DemoBundle\DataFixtures\ORM\LoadSimpleRoleData',
            'Acme\DemoBundle\DataFixtures\ORM\LoadSimpleUserData'
        ));

        // you can now run your functional tests with a populated database
        $client = static::createClient();
        // ...

        // test the login with simple user credential

    }

}

希望得到这个帮助。