Laravel测试入门指南

226 阅读15分钟

如果你正在阅读这篇文章, 这要么是因为你对Laravel测试的因素感到好奇,以及如何在你的应用程序中实现它们,或者是因为你只是想提高你对Laravel测试的认识。无论你的目标是什么, 在读完这篇文章后, 你都会有所收获的.

所以,不再多说,让我们来了解一下Laravel的概况,以及关于最流行的Web应用开发的PHP框架的一些有趣事实。

关于Laravel的介绍

无论你选择什么语言来开发,都有一个框架来构建网络应用。例如, 如果你是PHP背景的人, 想开发一个web应用, 那么Laravel是目前最好的web应用框架.这是因为Laravel可以节省网络应用程序开发的时间。此外, 它在使用上是经过实战检验的, 可以保持你的代码整洁和可维护性.

Laravel,由Taylor Otwell创建,是一个基于Symfony的开源PHP网络框架。Symfony是PHP世界中的另一个Web应用框架,它提供了开箱即用的几个可重用的PHP库和组件。Laravel遵循著名的MVC(model-view-controller)架构模式来设计Web应用。

Laravel创建的主要原因之一是为了使开发过程成为开发人员的愉快体验。通过这样做, 可以期待大量的生产力和有效的结果的回报.

"快乐的开发者能写出最好的代码"

然而, 为了让开发者在框架中获得愉快的体验, Laravel并没有放弃任何构建网络应用的关键功能.创建者和开源社区已经确保所有需要的功能,包括那些在其他语言框架中流行的功能,如ASP.Net,Sinatra和Ruby on Rails,可以帮助促进开发人员的经验,不断包含在Laravel框架中。

虽然有几个Web应用框架是基于PHP语言的, 但Laravel已经脱颖而出,并一直主导着PHP市场领域。JetBrains最近的一项调查显示,Laravel的使用率在2021年比前一年大幅增加了17%(50%到67%)。

usage of Laravel

资料来源

以下谷歌的搜索趋势(趋势期从2020年1月1日到2022年3月13日)显示, Laravel在其他PHP框架中排名第一。

Google’s search trend

你阅读这篇文章的主要原因可能是你现在正在处理一个基于Laravel的Web应用程序, 想知道测试所涉及的方面, 以及如何使用现有的测试框架, 库和平台来进行Laravel测试。如果是这样,你就来对地方了,让我们深入了解这个基于Laravel单元测试的网络应用教程。

测试一个Laravel应用程序

大多数程序员都明白这样一个事实:为他们开发的代码编写测试是一件好事。有些人可能有一个想法,为什么它是必不可少的,有些人甚至知道如何做到这一点。然而, 总有那么一群人, 在为什么必须要有测试和如何在实际应用开发中进行测试之间存在着很大的理解差距.Laravel提供了开箱即用的测试工具,如PHPUnit,Mockery,Faker和Dusk,以缩小PHP程序员之间的差距。

PHPUnit用于单元测试的开发, 而Mockery用于模拟数据库会话对象, 存储库, 或只是另一个依赖的类, 等等。Faker是为了测试目的而创建假数据。Dusk是一个前端测试框架,用于测试一个JavaScript应用程序。

为了使事情变得更容易,Laravel应用程序被预先打包,在构建应用程序时,可以成功地执行示例应用程序测试。这表示程序员不需要额外的配置来设置你的应用程序所需的基本测试环境。

除了这些工具之外,你还需要

  • 浏览器和不同操作系统的机器来进行或模拟你的Laravel网络应用的端到端测试
  • 持续集成(CI)管道,以实现构建和测试执行过程的自动化。
  • 案例跟踪系统,为你的CI管道中失败的测试案例创建错误/问题。

不同类型的Laravel测试

作为Laravel单元测试教程的一部分,我们将看到六种类型的Laravel测试策略来测试你的Laravel应用程序。

  1. 单元测试
  2. 功能测试
  3. 集成测试
  4. 验收测试
  5. 现场/实时测试
  6. 响应性测试

单元测试

单元测试代表了一个应用程序中最小的可测试部分/孤立的部分。这是一个事实,并不只是适用于只在Laravel框架中开发的应用程序。 通常情况下,测试一个类中的方法就属于这个类别。在为Laravel应用程序开发单元测试的情况下, 你可以使用PHPUnit.

单元测试的步骤

开发一个单元测试通常包括三个简单的步骤。

  1. 准备:定义变量, 实例化对象, 定义和注入模拟.
  2. 执行。调用需要进行单元测试的方法(Laravel网络应用的一个独立部分)
  3. 断言:比较预期输出和实际输出

无论你选择什么样的编程语言来开发应用程序, 每一个单元测试都遵循以上三个简单的步骤.

下面是一个单元测试案例的算法样本,用来测试一个数组中的元素数量。

Algorithm snippet

// Prepare - Defining and initializing the variable 
$cities = []; 

// Call the method to test (In this case, count)
$items = count($cities); 

// Assert the expected value 0 against the actual output stored in $items
$this->assertSame(0, $items);

隔离是关键

开发单元测试代码的一个基本方面是孤立地测试主观方法。这意味着,所有与你要进行单元测试的类方法没有直接关系的外部类/依赖关系都应该被模拟。记住,隔离是单元测试的关键。

比如说。当单元测试一个处理从数据库表中读取数据的服务类方法时,不应该把数据库表作为单元测试范围的一部分。相反,数据库资源库对象应该被模拟为单元测试的对象。在Laravel测试中,我们可以使用Mockery来实现这一目的。

让你的单元测试独立于订单

一个单元测试不应该依赖于其他单元测试。例如,不要在一个单元测试中设置一个状态变量,并使其成为另一个单元测试成功通过或执行的依赖状态。换句话说,一个好的做法是,每个单元测试都要有自己的变量/对象的状态来处理,而且应该以任何顺序执行。确保你的Laravel网络应用中的单元测试满足所有这些原则/规则。

执行单元测试的最新和更智能的方法

一旦你使用PHPUnit开发了你的单元测试案例, 你可以使用LambdaTestSelenium自动化平台,让你在一个可扩展和安全的Selenium基础设施上执行自动化测试脚本。

由于Laravel网络应用程序涉及到在用户界面页面所涉及的方法上编写的Unit测试,你可以在LambdaTest平台上用Selenium脚本来计划和执行自动化的浏览器测试,在一个由3000多个真实浏览器,操作系统和多个基于设备的环境的在线设备农场,让你的项目达到更高的测试覆盖率。

除此以外,你还可以

  • 大大减少构建过程中的整体耗时
  • 在你喜欢的错误跟踪工具中自动创建错误或问题,如Jira、Hive、Trello等。
  • 从一个地方访问对应于过去测试运行的测试运行日志

如果你的测试环境是在本地数据中心,也不用担心。这是因为,有了LambdaTest Tunnel功能,即使你的Laravel网络应用程序驻留在本地数据中心的服务器上,你仍然能够在云端的LambdaTest平台上运行Laravel测试,并获得上述的所有好处。

功能测试

为确保一个特定应用程序的功能以其应有的方式工作而进行的测试被称为功能测试。功能测试比单元测试所涵盖的范围更广,因为一个功能可能依赖于多个方法调用,并确保完整的功能在应用程序中工作。你必须测试应用程序中的整个依赖流程。注意,如果一个功能涉及到第三方系统调用或外部依赖,这些都可以被模拟。在处理外部依赖/外部系统时,我们会看到集成测试的作用。

由于这个方面的测试与Laravel应用程序的单一功能相关的多个方法, 开发一个功能测试代码比单元测试更艰难,更具挑战性。为了开发一个功能测试, 开发人员可以再次使用PHPUnit, 一个单元测试框架.

集成测试

为应用程序开发的单元测试可以确保代码在隔离状态下按照预期工作。在这种情况下,集成测试将确保那些不同的单个方法和它们的依赖关系如何粘合在一起,以实现应用程序的定义功能。这些测试类似于功能测试,因为它们将涉及到你的应用程序的多个方法。不过,它也涉及到外部应用程序/接口/数据存储库。集成测试,一般来说,不会依赖于模拟。

例如,让我们考虑一辆汽车,燃油喷射机制,变速箱和发动机可能会单独工作,如预期。然而,集成测试的目标是验证这些组件在组装成一个单一的集成车辆时是否能工作?

Laravel应用程序中的集成测试场景示例

  • 在一个Laravel网络应用程序中, 你将有一个路由定义为传入的请求到你的控制器方法, 这反过来调用服务方法来执行应用程序的定义的业务逻辑.例如, 这可能是处理图片上传到AWS S3或Azure blob存储,或从任何常用的存储系统读取文件。测试这样的路线包括测试所有这些存在于应用程序中的部分,并通过连接到应用程序的外部部分进行测试。这是一个典型的集成测试的场景。
  • 你的Laravel网络应用程序处理一个数据库来访问数据。在这种情况下, 你作为一个开发人员或测试程序员需要设置一个内存或测试数据库来执行集成测试.因此, 你不应该像在单元测试中那样模拟或存根一个资源库.

验收测试

虽然单元测试,功能测试和集成测试有助于满足开发人员的要求,但验收测试是确保端到端的应用规范或需求,如预期实现。

比如说。你在持续集成工具中的构建管道可能会得到成功,通过所有开发的单元、集成和功能测试。然而,当解决方案被部署到生产中时,它可能不符合最终用户的要求。这就是验收测试发挥作用的地方。

验收测试的流行框架

PHPUnit,与Laravel的开箱即用的工具,并没有提供所有必要的辅助工具来开发端到端的验收测试。

人们可以使用Laravel Dusk或Codeception框架来开发Laravel网络应用的端到端验收测试。

Laravel Dusk

Laravel Dusk更倾向于浏览器自动化测试类别, 而Codeception框架除了单元测试和功能测试外还可以进行验收测试.

Laravel Dusk可以用来测试Laravel网络应用程序,在其中,你可以使用真正的谷歌浏览器打开一个网页,自动执行重复的任务,抓取网站,并从页面上刮取信息,以测试应用程序是否在浏览器中工作。

Codeception

Codeception是在流行的框架和库的基础上定制的, 如PHPUnit, Mink等, 可以与Laravel的web应用程序进行高水平的互动,使用一个简单,可读的界面,甚至商业用户都可以使用。

使用Codeception, 你可以使用Google Chrome, Firefox, Safari, 或结合Selenium WebDriver云测试平台进行浏览器测试。使用Codeception,结合PHPBrowser,通过cURL发射的HTTP请求来模拟浏览器也是可能的。

执行验收测试的更聪明的方法

像LambdaTest这样基于云的自动化测试工具 提供了平行测试的好处,可以在不安装和维护本地Selenium网格的情况下执行Laravel自动化测试。无论你选择什么样的框架(Dusk或Codeception)来执行Laravel应用程序的验收测试, 当涉及到在一个平台上整合和执行验收测试,以提高你的生产力,减少构建时间和成本,检查LambdaTest平台所提供的服务。通过LambdaTest, 你可以在一个由3000多个浏览器和操作系统组成的在线浏览器农场上执行并行测试。

通过LambdaTest, 你可以很容易地将你的Laravel Dusk测试脚本与Selenium或Codeception测试脚本与Selenium整合在一起, 并使用LambdaTest平台来执行Laravel的自动化测试

对你的Laravel应用程序进行实时测试

除了自动化测试脚本的执行,如果你想对你的Laravel应用程序进行实时测试,不时地以临时的方式,你可以探索LambdaTest平台所提供的实时浏览器测试。

如果你有这样的疑问,为什么我不能在本地机器上安装的独立浏览器中进行测试,答案是,是的,这是一种方法。然而,因为任何用户群都可能访问你的网络应用程序,并且在他们的个人笔记本电脑/工作站上有任何操作系统或浏览器,设备的外形因素等,你就是无法控制它。因此,在各方面都是最好的,对组织来说,探索和利用LambdaTest提供的这种基础设施,使用它来进行Laravel应用程序的实时测试,是非常经济的。

LambdaTest的实时浏览器测试将是对你的Laravel网络应用程序进行人工实时测试的最佳选择。只要在LambdaTest上注册(如果你还没有这样做),并尝试他们平台上的功能。

manual live testing

要想开始,这里是我们关于实时测试的视频教程。

响应性测试

设计一个响应式的网络应用程序已经成为业界的事实标准,Laravel设计的网络应用程序也不能免俗。这是因为一个响应式的网络应用程序有利于在任何设备上的最佳渲染,无论是智能手机,笔记本电脑,平板电脑,还是桌面。

然而, 对于使用Laravel设计的网络应用程序或网站,实施自动化的响应式测试策略是相当具有挑战性的。这是因为它涉及到需要测试应用程序中所有实现的网页布局及其相应的导航选项。

为了使响应式网络应用程序的测试变得更容易,你可以使用LT浏览器,一个移动友好的测试器,在50多个预装的视口,如手机,平板电脑,台式机和笔记本电脑上运行响应性测试。通过LT浏览器,你可以实现响应性测试,适用于Laravel网站或Web应用程序中的各种布局。你还可以控制浏览器的视口尺寸, 精确定位布局过渡点, 包括面向布局的断言, 并直观地验证你的Laravel应用程序的布局的准确性.

LT Browser

在下面的视频教程中了解更多关于LT浏览器的信息。

结束语

在这篇关于Laravel测试的文章中, 我们从Laravel的介绍开始, 通过一些有趣的数据证明Laravel是PHP开发人员和测试人员中最受欢迎的Web应用框架。然后,我们了解了在Laravel网络应用程序测试中流行的测试框架,库和工具,以及它们在测试中发挥的作用。

接下来,我们列出了在进行Laravel网络应用程序测试时通常会出现的不同类型的测试。我们还阅读了诸如LambdaTest这样的测试平台如何帮助你在更短的时间内运行Laravel测试并进行实时浏览器测试,并提高成本效益。

带着这些结束语, 我希望你能探索市场上更多的创新和潮流的测试领域.

常见问题解答(FAQ)

什么是Laravel的测试?

Laravel的CreatesApplication特性是应用于你的应用程序的基础TestCase类。这个特性中的创建应用功能在运行你的测试之前引导Laravel应用。

什么是Laravel的facade?

Facade是Laravel应用中的一个类, 允许从容器中访问一个对象.Facade类包括了创建这项工作的机制。主IlluminateSupportFacadesFacade类将被Laravel的facade扩展,以及你设计的任何自定义facade。

什么是Laravel的中间件?

中间件提供了一个简单的方法来分析和过滤进入你的应用程序的HTTP请求.例如, Laravel有一个中间件来验证你的应用程序的用户是否被授权.