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

自动化测试:6个值得参考的Laravel开源项目

时间:2023-03-30 04:59:25 PHP

最近对自动化测试越来越感兴趣——密切关注PHPUnit、TDD、LaravelDusk、Travis等测试相关的关键词,于是决定把看看你周围的人是如何做自动化测试的。我在GitHub上发现了很多Laravel开源项目,并挑选了其中的6个来审查他们的测试解决方案。让我们分别看一下。免责声明:我刚刚查了完整的基于Laravel5.3+的Laravel项目(不包括依赖)1.Laravel.io传送门URL:https://github.com/lavelio/...最近重启的Laravel.io已经开源了代码在GitHub。DriesVints在这个项目中编写的测试非常好。Laravel.io使用功能测试和组件测试(类似于单元测试)。有趣的是,两次测试都进行了相同或相似的测试。示例1--tests/Feature/ReplyTest.phppublicfunctionusers_can_add_a_reply_to_a_thread(){factory(Thread::class)->create(['subject'=>'Thefirstthread','slug'=>'the-first-线']);$this->登录();$this->visit('/forum/the-first-thread')->type('第一个回复','body')->press('回复')->see('第一个帖子')->see('第一个回复')->see('回复成功添加!');}例2--tests/Components/Jobs/CreateReplyTest.phppublicfunctionwe_can_create_a_reply(){$job=newCreateReply('Foo','',$this->createUser(),factory(Thread::class)->create());$this->assertInstanceOf(Reply::class,$job->handle());}这很好用:测试Jobs层和实际点击浏览器中的东西。我还注意到Laravel.io已经升级到Laravel5.4,但是测试套件仍然使用5.3风格,使用BrowserKitTestCase实现。没有什么不妥,只是一个提醒。这个项目也是用Travis做持续集成的,后来发现大部分项目都用它。2.Cachet-一个开源的状态页面系统URL:https://github.com/cachethq/C...由JamesBrooks和GrahamCampbell领导,这个项目有一个很大的测试组件。他甚至很难通过观察表面来理解。那么,我们从哪里开始呢……其实我连燕郊项目的测试逻辑都不会深入,因为太难懂了,这里举个例子——tests/Models/ComponentTest.php:使用AltThree\TestBench\ValidationTrait;使用CachetHQ\Cachet\Models\Component;使用CachetHQ\Tests\Cachet\AbstractTestCase;类ComponentTest扩展AbstractTestCase{使用ValidationTrait;publicfunctiontestValidation(){$this->checkRules(newComponent());,这里用到了ValidationTrait,然后是一些AbstractTestCase。与此同时,这个逻辑就是所有的测试——一些抽象的“魔法”正在做所有的工作。我并不是说这是一件坏事——很确定他在内线工作得很好。他只是不容易学习和跟随。但如果有人想深入挖掘-祝你好运!3.OctoberCMSURL:https://github.com/octobercms...市场上第一个基于Laravel的CMS,它有一个很好的测试组件。首先---tests文件夹有一个非常有用的readme.md文件,专用于测试过程。OctoberCMS的所有测试包括:单元测试功能测试插件测试每个“区域”都有相应的基类来扩展——有TestCase、UiTestCase和PluginTestCase。总编辑也非常复杂和抽像——这里有一个例子tests/unit/backend/models/ExportModelTest.php:classExportModelTestextendsTestCase{////辅助//protectedstaticfunctioncallProtectedMethod($object,$name,$params=[]){$className=get_class($object);$class=newReflectionClass($className);$method=$class->getMethod($name);$方法->setAccessible(true);返回$method->invokeArgs($object,$params);}////测试//publicfunctiontestEncodeArrayValue(){$model=newExampleExportModel;$data=['foo','bar'];$result=self::callProtectedMethod($model,'encodeArrayValue',[$data]);$this->assertEquals('foo|bar',$result);$数据=['dps|治愈|坦克','圣骑士','狂战士','枪手'];$result=self::callProtectedMethod($model,'encodeArrayValue',[$data]);$this->assertEquals('dps\|heals\|tank|paladin|berserker|gunner',$result);$data=['艺术指导','罗马帝国','科幻'];$result=self::callProtectedMethod($model,'encodeArrayValue',[$data,'-']);$this->assertEquals('艺术指导-罗马帝国-科幻\-fi',$result);}}正如你所见,有一个静态辅助方法(顺便在其他类中复用),然后获取类/方法并调用他,我相信作者马上就明白了逻辑,但是很难局外人。同样有趣的是,OctoberCMS使用Selenium来实现某些功能:tests/readme.md文件提到了设置文档。4.Orgmanager-GitHub组织邀请系统网址:https://github.com/orgmanager...这是MiguelPiedrafita的一个非常简单的项目,Orgmanager的测试也非常简单易懂。也分为单元测试、功能测试和API测试。我在这里看到一个有趣的例子——从测试中调用Artisan命令,例如unit/JoinTest.php:publicfunctiontestJoinCommand(){$user=factory(User::class)->create();$org=factory(Org::class)->create(['userid'=>$user->id,]);Github::shouldReceive('authenticate')->once()->with($org->user->token,null,'http_token')->andReturn();Artisan::call('orgmanager:joinorg',['org'=>$org->id,'username'=>$user->github_username,]);$this->assertEquals($user->github_username.'wasinvitedto'.$org->name."\n",Artisan::output());}调用artisan命令并断言其输出——非常有趣.我确定他可以工作,但这是一种非标准方式。5.PHPMapURL:https://github.com/PHPMap/phpmap由FlorianWartner创建和维护。PHPMap有一个测试组件,让人联想到Laracasts或TestDrivenLaravel课程中教授的标准。这是Feature/FavoritesTest.php的示例。publicfunctionguests_can_not_favorite_anything(){$this->withExceptionHandling()->post('forum/replies/1/favorites')->assertRedirect('/login');}publicfunctionan_authenticated_user_can_favorite_any_reply(){$this->signIn();$reply=create('App\Models\Forum\Reply');$this->post('forum/replies/'.$reply->id.'/forum/favorites');$this->assertCount(1,$reply->favorites);}PHPMap的测试分为单元、函数、LaravelDusk等等!最后我找到了一个实际在生产中使用Dusk的项目。这是他的外观-tests/Browser/MapTest.php:publicfunctiontestMap(){$this->browse(function($browser){$browser->visit('/map')->assertSee('PHPMap');});}6.Timegrid——免费、开源、在线运行平台URL:https://github.com/timegridio...Timegrid最大的贡献者是ArielVallese,他在测试方面做得很好。这里只有很多的测试:单元,实验和集合,每个文件都有更深的子文件夹目录,例如:——acceptance/scenarios/consulting/ConsultingScenarioTest.php:publicfunctionit_fits_for_consulting_scenario()S$thiscenario-consulting_scenario());$this->the_business_publishes_a_consulting_service();$this->the_business_publishes_vacancies();$this->a_user_subscribes_to_business();$this->the_user_queries_vacancies();$this->it_provides_available_times_for_requested_service_date();$this->the_user_takes_a_reservation();$this->the_user_sees_the_reservation_ticket();}公共函数the_business_publishes_a_consulting_service(){$this->service=$this->makeService(['name'=>'OnSite4hsSupport','duration'=>60*4,]);$this->actingAs($this->owner);$this->call('POST',route('manager.business.service.store',$this->business),$this->service->toArray());$this->assertCount(1,$this->business->fresh()->services);}一个all-in-one的方法,然后一个一个地枚举更多的测试:仓库里的官方统计看起来还不错:89%的测试覆盖率最后,有趣的是,作者甚至测试了迁移文件,如tests/unit/migration/MigrationTest.php:publicfunctionit_refreshes_rollbacks_and_seeds_the_database(){$database=env('DB_CONNECTION');$this->assertNotNull($database);$exitCode=Artisan::call('migrate:refresh',['--database'=>$database]);$this->assertEquals(0,$exitCode);$exitCode=Artisan::call('migrate:rollback',['--database'=>$database]);$this->assertEquals(0,$exitCode);$exitCode=Artisan::call('migrate',['--database'=>$database]);$this->assertEquals(0,$exitCode);$exitCode=Artisan::call('db:seed',['--database'=>$database]);$this->assertEquals(0,$exitCode);}在使用Artisan命令进行测试中可能不是最好的设计模式,但它只是测试任何Web应用程序中最重要的功能之一。总体结论在查看了所有这些不同的项目(以及那些由于各种原因未被提及的项目)之后,这是我对自己关于测试的主要要求:不要在“单元”或“功能”之间做出选择——大多数项目都是两者或更多类型的测试;大多数项目使用持续集成(通常是Travis)和测试组件-否则,为什么不喜欢编写测试?有很多不同的方法来构建测试——这完全取决于项目,这里没有“银招”;还有很多方法可以对内部测试功能进行分组——辅助方法、抽象类、种子数据等。没有特定的规则,找到适合你的。迁移到更新版本的Laravel可能会很痛苦——例如,5.3的测试看起来与5.4的测试不一样。所以你需要提前考虑更新。以不同的方式思考——随着项目的增长,您将不得不返回并修改/添加测试。在这些项目中,我有一种“预感”,有一些遗留代码,只是因为一些测试将不再使用。以上是我的经验,你有没有什么可以添加到你的开源项目列表中来学习测试的?文章转自:https://learnku.com/laravel/t...更多文章:https://learnku.com/laravel/c...