教你掌握 Laravel 的测试方法

  • 来源:网络
  • 更新日期:2020-07-28

摘要:下面由Laravel教程栏目给大家介绍掌握 Laravel 的测试方法,希望对需要的朋友有所帮助!掌握 Laravel 的测试方法不管你承认与否在研发一款产品时,软件测试对项目而言意义重大,然

下面由Laravel教程栏目给大家介绍掌握 Laravel 的测试方法,希望对需要的朋友有所帮助!

掌握 Laravel 的测试方法

不管你承认与否在研发一款产品时,软件测试对项目而言意义重大,然而是测试通常被我们视而不见。这篇文章我们主要研究 Laravel 框架的测试方法。

或许你还不知道,Laravel 内核早已继承了 PHPUnit 单元测试组件。PHPUnit 是 PHP 社区里使用最广泛、最受欢迎的测试框架之一。PHPUnit 同时支持「单元测试」和「功能测试」两种特性。

我们会简单介绍 PHPUnit 「单元测试」和「功能测试」的基本使用方法。继而,讲解如何在 Laravel 项目中创建「单元测试」和「功能测试」用例。不过本篇我们假定你已经对 PHPUnit 测试框架有了基本的了解,所以让我们把焦点放到 Laravel 中使用 PHPUnit 进行测试这个主题中。

单元测试和功能测试

如果您已经接触过 PHPUnit 框架,那么您应该知道,它支持两种类型特性 -- 「单元测试」和「功能测试」。

「单元测试」的目的是用于测试函数或方法的正确性。更重要的是,我们可以轻松实现代码逻辑的正确性。

如果您在开发过程中发现某个功能包含多个逻辑处理,那么最好将每个处理逻辑拆分到不同的方法里,这样以确保单个方法和代码块可测试。

我们以一个理想的方法来窥探单元测试的奥秘。

<?php
public function getNameAttribute($value)
{
    return ucfirst($value);
}

如你所见,这个方法仅处理一个业务逻辑,方法内部通过 ucfirst 函数将字符转换成首字母大写格式。

单元测试是为了保证每个独立单元的代码正确性;功能测试则是为了保证一个功能的正确性。一言以蔽之,就是通过特定的测试用例模拟用户访问应用的行为验证系统的正确性。

例如,我们可以为包含如下步骤的登录功能实现一个功能测试用例:

发起一个访问登录页面的 GET 请求;

判断我们是否处在登录页面;

生成用于采用 POST 请求方式登录的登录数据;

判断是否创建登录会话数据成功。

这就是应该如何创建「功能测试」用例的秘密。接下来我们将创建具体的测试用例,来讲解如何在 Laravel 中使用「单元测试」和「功能测试」。

搭建测试环境

创建测试模型

在开始创建测试用例前,我们需要先构建起用于测试的项目依赖。

先执行下面的 artisan 命令创建一个 Post 模型及其对应的迁移文件。

$ php artisan make:model Post --migration

上面的命令将为我们创建一个 Post 模型类和数据库迁移文件。

Post 模型代码如下:

<?php
// app/Post.php
namespace App;
use Illuminate\\Database\\Eloquent\\Model;
class Post extends Model
{
    //
}

数据库迁移文件 YYYY_MM_DD_HHMMSS_create_posts_table.php 将创建在 database/migrations 目录中。

Post 数据表会存储一篇文章的标题。修改后 Post 数据库迁移文件代码如下:

<?php
use Illuminate\\Support\\Facades\\Schema;
use Illuminate\\Database\\Schema\\Blueprint;
use Illuminate\\Database\\Migrations\\Migration;
class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

如你所见,我们通过新增的 $table->string('name') 来存储文章的标题。接下来,执行数据库迁移命令就回在数据库中创建对应的数据表了。

$ php artisan migrate

在创建完数据表之后,我们需要向 Post 模型类中加入如下代码

<?php
namespace App;
use Illuminate\\Database\\Eloquent\\Model;
class Post extends Model
{
    /**
     * Get the post title.
     *
     * @param  string  $value
     * @return string
     */
    public function getNameAttribute($value)
    {
        return ucfirst($value);
    }
}

我们刚刚添加了 accessor 方法,它的功能是修改文章的标题,这正是我们在单元测试用例中要测试的。