我对测试世界还很陌生,我想确保自己走在正确的轨道上。
我正在尝试使用phpunit在symfony2项目中设置单元测试。
PHPUnit正在运行,简单的默认 Controller 测试也可以正常工作。 (但是,这与功能测试无关,而是对应用程序进行单元测试。)
不过,我的项目在很大程度上依赖于数据库交互,据phpunit's documentation的理解,我应该基于\PHPUnit_Extensions_Database_TestCase
设置一个类,然后为我的数据库创建夹具并从那里开始工作。
但是,symfony2仅提供WebTestCase
类,该类仅从\PHPUnit_Framework_TestCase
扩展到开箱即用。
那么,我是否应该假设我应该创建自己的DataBaseTestCase
,该副本主要复制WebTestCase
,而不同之处在于它是从\PHPUnit_Extensions_Database_TestCase
扩展并实现了所有抽象方法的?
还是针对基于数据库的测试为symfony2提供了另一个“内置”推荐工作流程?
因为我要确保模型存储和检索正确的数据,所以我不想最终偶然地测试了该学说的细节。
最佳答案
我从未使用过PHPUnit_Extensions_Database_TestCase
,主要是因为以下两个原因:
我的理论方法...
我将doctrine/doctrine-fixtures-bundle用于灯具(无论出于什么目的),并使用所有灯具设置整个数据库。然后,我将对此数据库执行所有测试,并确保在测试更改后重新创建该数据库。
优点是,如果测试仅读取但不更改任何内容,则无需再次设置数据库。对于更改,我必须删除它并再次创建它,或者确保还原更改。
我使用sqlite进行测试,因为我可以设置数据库,然后复制sqlite文件并将其替换为干净的文件,以恢复原始数据库。这样,我就不必删除数据库,创建数据库并再次加载所有装置来生成干净的数据库。
...以及代码
我写了一个article about how I do database tests with symfony2 and phpunit。
尽管它使用sqlite,但我认为可以轻松地进行更改以使用MySQL或Postgres或其他任何东西。
进一步思考
以下是一些可行的其他想法: