vin*_*nux 12 php unit-testing symfony
测试与Symfony2的数据库交互的当前最佳实践是什么?我有一个简单的CRUD设置,我想确保我的测试没问题.现在,我有4个测试,每个测试确保创建,更新,删除和列出操作正常.
在我的测试用例中,我有两个神奇的方法,__ construct和__destruct.在它们内部,我使用'php app/console ...'调用exec()以创建数据库,创建模式,然后删除数据库.然而,这很慢,当我有一个以上的测试用例时它会一直发生.
在数据库测试和隔离此类测试时,我应该如何进行?
我认为最好始终开始清洁以确保测试完全隔离.要做到这一点,我只是在每次测试之前构建数据库结构,而不是用给定测试所需的夹具填充它.
请注意,我只构建所需的数据库表,而我只插入所需的灯具.它比加载大型数据库转储要快一些.它也更干净,因为测试不共享灯具(这使它们更容易维护).
我有一个名为KernelAwareTest的基本测试用例类,它可以帮助我构建模式.你可以在gist上找到它:https://gist.github.com/1319290
setUp()引导Symfony内核并在类属性中存储对它的引用(以及对DIC和实体管理器的引用).此外,还调用generateSchema()了生成数据库模式(它使用Doctrine中的Schema Tool).
默认情况下,它为实体管理器已知的所有实体生成数据库结构.您可以通过重写getMetadatas()方法来更改测试类中的此行为.
PS:我尝试在内存数据库(sqlite)中使用,但它并不完美.无论如何,对生产中使用的数据库运行测试可能更好.
数据库测试总是很慢,因为您需要在每次测试之前/之后创建/删除模式.为避免不必要的操作,您可以:
对于测试用例,架构将仅创建/下载一次.
您还可以设置doctrine以使用inmemory sqlite数据库(速度非常快):
doctrine:
dbal:
driver: pdo_sqlite
path: :memory:
memory: true
Run Code Online (Sandbox Code Playgroud)
无论如何,'_ construct'和' _destruct'永远不应该用在phpunit测试用例中,而应该使用'setUp'和'tearDown'.
| 归档时间: |
|
| 查看次数: |
3868 次 |
| 最近记录: |