当前位置: 首页 > 后端技术 > PHP

PHPUnit实践三(搭建模块化测试单元)

时间:2023-03-29 18:26:02 PHP

本系列教程所有PHPUnit测试均基于PHPUnit6.5.9版本。Lumen5.5框架目录结构模块下的目录符合Lumen模块结构。例如:Controllers、Models、Logics等是Lumen模块目录下的结构目录。如果你有自己的同级目录Assignment就够了,比如这里Requests的整体结构├──BaseCase.php重写了Lumen基类的测试基类,供我们使用这个基类作为测试基类。后续会讲解├──bootstrap。php测试自动加载文件├──Cases测试用例目录│└──Headlinea测试模块│├──logs日志输出目录│├──PipeTest.phpPHPUnit流程测试用例│├──phpunit.xmlphpunit配置文件xml│└──README.md本模块测试用例说明├──ExampleTest.php最原始的测试demo└──TestCase.phpLumen自带的测试基类模块目录结构Headline//测试用例目录模块├──缓存├──控制器├──ArticleTest.php│├──...├──监听器│└──MyListener.php├──逻辑├──模型├──ArticleTest.php│├──...├──README.md├──Requests│├──ArticleTest.php│├──...├──logs//日志和覆盖目录│├──html││├──...││└──index.html│├──logfile.xml│├──testdox.html│└──testdox.txt├──phpunit-debug-demo.xml//phpunit.xml案例├──phpunit-debug.xml//测试重命名└──phpunit.xml//官方xml配置BaseCase.php'token*','dev'=>'token*','prod'=>''//如果测试为真,请填写授权令牌];/***重写setUp*/publicfunctionsetUp(){parent::setUp();$this->seeder=false;如果(method_exists($this,'factory')){$this->app->make('db');$this->factory($this->app->make(Factory::class));if(method_exists($this,'seeder')){if(!method_exists($this,'seederRollback')){dd("请先创建seederRollback回滚方法");}$this->seeder=true;$this->播种机();}}}/***重写tearDown*/publicfunctiontearDown(){if($this->seeder&&method_exists($this,'seederRollback')){$this->seederRollback();}父母::拆解();}/***获取地址*@paramstring$apiKey*@paramstring$token*@returnstring*/protectedfunctiongetRequestUri($apiKey='list',$token='dev',$ddinfoQuery=true){$查询=“?令牌=”。static::TOKEN[strtolower($token)];如果($ddinfoQuery){$query=$query.“&”。http_build_query(静态::DDINFO);}返回$apiUri=static::DOMAIN。静态::A??PI_URI[$apiKey]。$查询;}}phpunit-debug-demo.xml这个文件就是我们直接写的一些测试用例的xml。它不需要来回测试。测试成功的测试用例终于写好了。然后使用官方的phpunit.xml。具体看运行测试阶段如何指定配置<过滤器><目录后缀=".php">../../../app/Http/Controllers/Headline<目录后缀=".php">../../../app/Http/Requests/Headline<目录后缀=".php">../../../app/Models/Headline<排除><文件>。./../../app/Models/Headline/ArticleKeywordsRelationModel.php。/测试用例define(ArticlesModel::class,function(Generator$faker)使用(&$id,$words){$id++;return['id'=>$id,'uri'=>$faker->lexify('T????????????????????'),'title'=>$id==263?“搜索”:$words[rand(0,sizeof($words)-1)],'authorId'=>1,'state'=>1,'isUpdated'=>0,];});}/***生成模拟数据需要seederRollback成对出现*/publicfunctionseeder(){$articles=factory(ArticlesModel::class,10)->make();foreach($articlesas$article){//注意:article是引用对象,不是复制if($article->isRecommend){$article->recommendTime=time();}$文章->保存();}}/***getArticleList测试数据*@returnarray*/publicfunctiongetArticleListDataProvider(){return[[1,"Search",1,10,1],[2,"Search",1,10,0],[2,null,1,10,0],[3,"搜索",1,10,0],[1,null,1,10,1],[2,null,1,10,0],[3,空,1,10,0],];}/***@dataProvidergetArticleListDataProvider*/publicfunctiontestGetArticleList($type,$searchText,$page,$pageSize,$expceted){$rst=self::$model->getArticleList($type,$searchText,$page,$pageSize);}$this->assertGreaterThanOrEqual($expceted,sizeof($rst));$rst=self::$model->getArticleCount($type,$searchText);$this->assertGreaterThanOrEqual($expceted,$rst);}/***addArticle测试数据*@returnarray*/publicfunctionaddArticleDataProvider(){return[[['id'=>273,'uri'=>'dddddddddd0123'],'save',0],[['id'=>274,'uri'=>'dddddddddd123'],'publish',0],[['id'=>275,'uri'=>'dddddddddd456'],'预览',0],];}/***@dataProvideraddArticleDataProvider*/publicfunctiontestAdd($data,$action,$expected){$rst=self::$model->addArticle($data,$action);如果($rst){self::$model::where('id',$rst)->delete();}$this->assertGreaterThanOrEqual($expected,$rst);}publicfunctiontestGetArticleInfo(){$rst=self::$model->getArticleInfo(263,0);$this->assertGreaterThanOrEqual(1,sizeof($rst));$rst=self::$model->getArticleInfo(2000,1);$this->assertEquals(0,sizeof($rst));}/***回滚模拟的数据到初始状态*/publicfunctionseederRollback(){self::$model::where('id','>=',263)->where('id','<=',272)->删除();}}运行测试cd{APPROOT}/tests/Cases/Headline#mvphpunit-debug-custom.xml->phpunit-debug.xml../../../vendor/bin/phpunit--verbose-cphpunit-debug.xml参考PHPUnit5.0官方中文手册