做一个项目势必要进行单元测试以保证程序的健壮性,以便保证版本迭代时功能正常。但是如果一个程序(如CMS等)本身就是依赖于数据库的,应该如何在保证不会破坏数据库的情况下进行单元测试呢?
举例:
访问?id=1的页面,先查询
sqlSELECT * FROM `data` WHERE `ID` = 1
,然后将其赋值给$data->ID、$data->Title这些属性;要保证这些属性的值正常。
然后,根据一些信息算出$data->Hash,如$data->Hash = md5($data->ID),这些计算的值也要正常。
接着,删除id=1的文章,要
sqlDELETE FROM `data` WHERE `ID` = 1
,必须保证ID所在行被删除。
再其次,后台发布一篇文章,必须使得数据库内多出ID=2,内容为设定值的文章。但是HTML代码内容不一定要相同,可以允许诸如多余的空格、换行。
还需要模拟XML-RPC协议发表一篇文章。
像以上的内容,应该如何进行单元测试呢?
知乎同名问题:http://www.zhihu.com/question/28278690
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
用单独的数据库运行测试,每次测试开始前都清空数据库,并重新生成测试数据。
另一种做法是每次生成测试数据的时候记录下来生成的数据的 ID, 然后在完成测试后删除本次生成的数据,而不是每次都清空数据库。这种方案比较适合既需要自动测试,又需要手动测试的情况,自动测试不会导致手动测试时添加的数据被删除。
测试最好别依赖于具体的值(比如你的例子的 ID=1),最好用单独的函数来创建每一条测试数据(比如
generateAccount和generateArticle),这些函数返回创建出来的数据的 ID, 否则如果硬编码 ID 的话,在添加或移除测试的时候会很麻烦。使用三种数据库配置:
dev: 开发时使用的数据库配置
test: 测试用的数据库配置, 每次自动清空和load fixtures
production: 部署时生产环节的数据库配置
你用isolating test、mock、fakes关键字搜索一下,就知道怎么做对外部数据/逻辑有依赖的单元测试了。
插件得在你的git初始化了这个目录才行。他这样的原因就是没有找到当前路径里的git文件夹,这个文件夹里有远程的地址。