单元测试你的模型
编写单元测试你的推动或理论模型非常简单。在本教程中,您将学习一些技巧和最佳实践来编写更好的测试模型。
数据库配置
测试驱动模型类,您需要一个数据库。你已经有了一个用于开发,但它始终是一个好习惯为你创建一个专用的测试。
下所有的测试运行测试
环境中,我们只需要编辑配置/ databases.yml
配置文件并覆盖默认设置测试
环境:
测试:推动:param: dsn: mysql: dbname = myproject_test;主机= localhost dev: # dev配置:推动:类:sfPropelDatabase参数:dsn: mysql: dbname = myproject;主机= localhost用户名:someuser密码:somepa $ $字编码:use utf8持久:真正的池:真正的类名:PropelPDO
在这种情况下,我们只有改变了数据库名称,但您也可以改变数据库引擎,例如使用SQLite。
现在我们已经配置了数据库,我们可以创建表使用推动:插入sql
任务:
php syob娱乐下载mfony推动美元:插入sql - env =测试
测试数据
现在我们有一个专门的数据库对于我们的测试,我们需要一种方法来加载一些测试数据(fixture)每次我们发射单元测试。这是因为我们想把数据库在同一状态每次我们运行我们的测试。
这是非常容易的sfData
类:
美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_test_dir”)。/设备的);
的loadData ()
方法接受一个目录或一个文件作为它的第一个参数。一个共同的固定装置
目录是这样的:
测试/夹具/ 10 _categories。yml 20 _articles。yml 30 _comments。yml
注意数字前缀所有文件名。这是一个简单的方法来控制数据加载的顺序。在之后的项目,如果我们需要插入一些夹具文件,这将是容易,因为我们有一些免费的数字之间现有的:
测试/夹具/ 10 _categories。yml 15 _must_be_laoded_between_categories_and_articles。yml 20 _articles。yml 30 _comments。yml
聪明的读者可能会发现,我们已经把我们的设备测试/
目录,而书中提倡symfony将他们的ob娱乐下载数据/
目录中。这真的是一种味道,但是我喜欢组织在这两个目录因为夹具可以分类在两个不同的组:
数据/夹具
:包含所有的原始数据需要实际工作的应用程序测试/夹具
:包含所有数据所需的测试(单元测试和功能)
这个简单的计划没问题,当你有一个小的测试数据集,但是当你的模型的增长,你开始有更多的设备,所花费的时间在数据库中加载它们可以成为重要的。所以,我们只需要一种方法来加载测试数据的子集。这样做的方法之一是sub-categorize测试数据通过创建子目录/主要特点:
测试/夹具/ 10 _cms / 10 _categories。yml 20 _articles。yml 30 _comments。yml 20 _forum / 10 _threads.yml
现在,而不是加载主固定装置
目录,我们可以负载的子目录中,这取决于你想要测试的模型类。但是大多数时候,你也需要加载一些共享数据,如用户:
测试/夹具/ 00 _common / 10 _users。yml 10 _cms / 10 _categories。yml 20 _articles。yml 30 _comments。yml 20 _forum / 10 _threads.yml
为了缓解这个用例,loadData ()
方法可以是一个数组的目录和/或文件:
/ /加载用户和CMS所有数据美元的装载机=新sfPropelData();美元的装载机- >loadData(数组(sfConfig::得到(“sf_test_dir”)。“/夹具/ 00 _common / 10 _users.yml”,sfConfig::得到(“sf_test_dir”)。“/夹具/ 10 _cms”,));
这将负载10 _users.yml
设备文件,然后所有的装置中10 _cms
目录中。
编写单元测试
现在我们有一个专门的数据库和数据库知道状态,让我们创建一些单元测试文章
模型。
这是一个典型的驱动单元测试引导文件:
/ /测试/单位/模型/ ArticlePeerTest.php包括(目录名(__FILE__)。“/ . . / . . /引导/ unit.php”);美元配置= ProjectConfiguration::getApplicationConfiguration(“前端”,“测试”,真正的);新sfDatabaseManager(美元配置);美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_test_dir”)。/设备的);$ t=新lime_test(1,新lime_output_color());$ t- >诊断接头(“::retrieveBySlug ()”);美元的文章= ArticlePeer::retrieveBySlug(“the-best-framework-ever”);$ t- >是(美元的文章- >getTitle(),“有史以来最好的框架”,”——> retrieveBySlug()返回匹配给定条蛞蝓的);
这个脚本是不言自明的:
作为每一个单元测试,我们包括引导文件。
包括(目录名(__FILE__)。“/ . . / . . /引导/ unit.php”);
我们创建一个配置对象
测试
环境和我们启用调试:美元配置= ProjectConfiguration::getApplicationConfiguration(“前端”,“测试”,真正的);
这也将推动的半自动的类进行初始化。
我们创建一个数据库管理器。它初始化加载的驱动连接
databases.yml
配置文件:新sfDatabaseManager(美元配置);
我们通过使用加载我们的测试数据
sfPropelData
:美元的装载机=新sfPropelData();美元的装载机- >loadData(sfConfig::得到(“sf_test_dir”)。/设备的);
现在一切就绪后,我们可以开始测试我们的模型对象。
如果你不习惯写单元测试,它可以令人生畏。
这里有一些建议我用所有的时间来知道我需要测试:
- 测试类的一个方法
- 测试,对于一个给定的输入,您期望的输出方法
- 阅读方法的代码和测试的所有业务规则
- 从来没有测试明显的事情或东西是通过另一种方法来完成
我的测试文件总是相同的结构模式:
/ /输出消息的方法测试(为实例方法- >,::类方法)$ t- >诊断接头(”——> methodName ()”);/ /测试1件事,可以表示为一个简单的句子/ /这句话总是首先方法名/ /然后一个动词来表达必须做什么,它必须是如何表现的,……$ t- >是(美元的对象- >methodName(),1,”——> methodName()返回1如果你通过不争论”);
代码覆盖率
当你编写测试时,很容易忘记测试条件在一个复杂的代码。
ob娱乐下载symfony 1.2提供了方便的任务测试代码覆盖率,覆盖测试:
。
所以,我测试后写的对于一个给定的类,我总是启动覆盖测试:
任务可以肯定的是我已经测试了一切:
美元php ob娱乐下载symfony测试:测试/单位/模型/ ArticleTest报道。php lib /模型/ Article.php
第一个参数是一个测试文件或一个测试目录。第二个是你想知道的文件或目录的代码覆盖率。
如果你想知道行不介绍,简单的添加——详细
选择:
美元php ob娱乐下载symfony测试:报道——详细的测试/单位/模型/ ArticleTest。php lib /模型/ Article.php
这个工作许可适用创作共用署名下衍生著作3.0 Unported许可执照。