打造高质量Yii2应用,从测试开始!

背景

在程序员日常开发中,测试是一个不可或缺的环节。然而,很多开发者往往忽视了测试的重要性,导致应用的质量不尽如人意。尤其是在大型项目中,测试的工作量更是庞大,难以胜任。因此,如何打造高质量的应用,从测试开始就成为了一个关键问题。在Yii2框架中,基于Codeception的测试技术可以帮助开发者轻松实现全面、高效的测试,从而提高应用的质量和稳定性。本文将介绍如何使用Codeception进行Unit、API、Acceptance三种测试,以及如何优化测试的流程和效率,帮助开发者打造高质量的Yii2应用。

可通过官网地址codeception.com/docs 进行学习。

准备工作

1、安装 Codeception

您可以使用 Composer 在项目中安装 Codeception。在终端中进入项目根目录,然后运行以下命令:

lua 复制代码
composer require "codeception/codeception" --dev

2、初始化测试套件

在项目根目录中,使用以下命令初始化测试套件:

bash 复制代码
vendor/bin/codecept bootstrap

这会创建一个 tests 目录,并在其中创建一些默认的测试文件和配置文件。

3、配置测试套件

您需要根据您的项目需求配置测试套件。在 tests 目录中,有一个名为 codeception.yml 的配置文件,其中包含了测试套件的配置信息。您可以根据需要修改该文件。

一旦您完成了上述准备工作,就可以执行 php vendor/bin/codecept build 命令来构建测试套件了。该命令将根据测试套件的配置信息生成测试文件和测试类,并将其保存在 tests/_support 目录中。

Unit单元测试

配置

unit.suite.yml 是 Codeception 单元测试套件的配置文件,它定义了单元测试套件的各种设置和参数。

yaml 复制代码
# Codeception Test Suite Configuration

# suite for unit (internal) tests.
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.

class_name: UnitTester
modules:
    enabled:
      - Asserts
      - Yii2:
            part: [orm, email, logger]

modules: 定义单元测试套件使用的模块。例如,Asserts 模块提供了各种断言方法,Db 模块提供了数据库操作方法等。

执行 php vendor/bin/codecept build 命令可以生成测试运行所需的自动加载文件和其他必要的文件。这个命令会根据 unit.suite.yml 文件中的配置生成一些必要的文件,例如测试类的自动加载tests/_support/_generated/UnitTesterActions.php 文件、测试结果输出目录unit等。如果没有执行这个命令,可能会导致测试运行失败或者出现其他问题。因此,在运行单元测试之前,建议先执行 php vendor/bin/codecept build 命令,以确保测试环境的正确设置。

更多modules可查看官方链接 codeception.com/docs/Module...

单元测试脚本开发

使用 generate:test 命令创建测试,并将套件和测试名称作为参数:

bash 复制代码
php vendor/bin/codecept generate:test Unit Example

生成ExampleTest.php文件,文件内容:

php 复制代码
<?php

namespace Tests\Unit;

use \Tests\Support\UnitTester;

class ExampleTest extends \Codeception\Test\Unit
{
    protected UnitTester $tester;

    protected function _before()
    {
    }

    // tests
    public function testMe()
    {

    }
}

执行以下命令即可运行单元测试:(注意Unit大小写)

arduino 复制代码
php vendor/bin/codecept run Unit

或者

php vendor/bin/codecept run Unit ExampleTest

API测试

配置

进行api接口应创建一个新的测试套件(bootstrap 命令未提供)。我们建议将其命名为 api 并使用 ApiTester 类。

bash 复制代码
php vendor/bin/codecept generate:suite api

输入以上命令后,Codeception会在tests目录下创建一个名为api的文件夹,并在其中创建一个空的api.suite.yml文件。

打开api.suite.yml文件,根据需要配置测试套件的参数,例如测试环境、测试用例、测试模块等。

完成以上步骤后,就可以使用api测试套件来编写和运行接口测试用例了。

api.suite.yml是Codeception测试框架中用于配置接口测试套件的YAML格式配置文件。该文件通常位于项目根目录下的tests文件夹中。

less 复制代码
actor: ApiTester
modules:
    enabled:
        - Filesystem
        - Asserts
        - REST:
            # API 基础 URL
            url: /
            # 请求头信息
            headers:
            - {name: 'Content-Type', value: 'application/json'}
            # 响应断言
            depends: Yii2

使用REST模块进行API测试需要安装codeception/module-rest依赖包,可以通过Composer进行安装,运行命令:

lua 复制代码
composer require codeception/module-rest --dev

安装完成后,就可以在api.suite.yml中启用REST模块,并设置API的地址等配置信息。

:别忘了php vendor/bin/codecept build,然后可在tests/_support/_generated/ApiTesterActions.php路径看到你加载模块成功的方法,比如设置请求头内容$I->haveHttpHeader $I->sendGet注释中带了很多的使用示例,简直就是一学就会。

API测试脚本开发

Yii2 codecept ApiTester接口api测试主要是通过模拟HTTP请求来测试API接口。ApiTester类提供了一系列的方法,如sendGET()sendPOST()sendPUT()sendDELETE()等,可以用来发送HTTP请求,同时还提供了一些辅助方法如seeResponseCodeIs()seeResponseContainsJson()seeResponseMatchesJsonType()等,用于断言HTTP响应的状态码、响应内容等。通过这些方法可以方便地对API接口进行测试。

使用 generate:cest 命令创建测试,并将套件和测试名称作为参数:

bash 复制代码
php vendor/bin/codecept generate:cest api Upload

生成文件tests/api/UploadCest.php

php 复制代码
<?php
class UploadCest
{
    public $uploadData;
    public $file;

    public function _before(ApiTester $I)
    {
        //加载yii模块内容
        $config = require(__DIR__ . '/../../config/test.php');
        new \yii\web\Application($config);
    }
    public function tryToTest(ApiTester $I)
    {
        $I->wantTo('上传文件');
        $I->comment('默认参数上传文件text.txt');
        $I->sendPost('/upload', [
            'data' => json_encode($this->uploadData),
        ],[
            'attachment_1' => $this->file,
        ]);
        $I->seeResponseCodeIsSuccessful();
        $I->seeResponseContainsJson(['code' => 0, 'msg' => 'success']);
    }
}

执行以下命令即可运行API测试:(注意api大小写)

arduino 复制代码
php vendor/bin/codecept run api

或者

php vendor/bin/codecept run api UploadCest

Acceptance测试

环境准备

WebDriver下载

WebDriver是一种用于自动化Web浏览器的工具,可以模拟用户在浏览器中的操作,如点击、输入、滚动等。在使用AcceptanceTester进行WebDriver测试之前,需要安装WebDriver,并确保WebDriver可以与测试框架进行交互。

本人经过查询资料得知mac安装方法,其他系统请读者自行百度或GPT一下(备注:确有需要留言出教程)

在 Mac 系统上,您可以通过以下步骤下载和启动 Selenium WebDriver:

arduino 复制代码
// 下载
curl -O https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar
arduino 复制代码
// 启动,跟上面下载同一目录(java自行安装哦)
java -jar selenium-server-standalone-3.141.59.jar

出现以下你就成功啦

vbscript 复制代码
16:49:15.970 INFO [GridLauncherV3.parse] - Selenium server version: 3.141.59, revision: e82be7d358

16:49:16.093 INFO [GridLauncherV3.lambda$buildLaunchers$3] - Launching a standalone Selenium Server on port 4444

2023-08-11 16:49:16.160:INFO::main: Logging initialized @566ms to org.seleniumhq.jetty9.util.log.StdErrLog

16:49:16.435 INFO [WebDriverServlet.<init>] - Initialising WebDriverServlet

16:49:16.587 INFO [SeleniumServer.boot] - Selenium Server is up and running on port 4444

浏览器驱动下载

WebDriver需要与浏览器进行交互,因此需要安装对应浏览器的驱动程序。常见的浏览器驱动程序包括ChromeDriver、GeckoDriver、SafariDriver等。在使用AcceptanceTester进行WebDriver测试之前,需要安装对应浏览器的驱动程序,并将其配置到测试框架中。

根据你本地谷歌浏览器下载对应的浏览器驱动版本:chromedriver.storage.googleapis.com/index.html

加载到全局命令bin中 export PATH=$PATH:/path/to/chromedriver

我的谷歌浏览器版本是115.0.5790.170,则下载最新的驱动版本114.0.5735.90也可以的

驱动链接:chromedriver.storage.googleapis.com/index.html?...

测试框架中WebDriver模块下载

Codeception的WebDriver模块是通过codeception/module-webdriver包来实现的。要使用WebDriver进行测试,需要先安装该模块。可以通过Composer进行安装,命令如下:

lua 复制代码
composer require codeception/module-webdriver --dev

安装完成后,在测试框架的配置文件中指定WebDriver模块即可开始使用。例如,在acceptance.suite.yml中添加以下配置:

vbnet 复制代码
actor: AcceptanceTester
modules:
    enabled:
        - WebDriver:
            url: 'http://127.0.0.1:91/'
            browser: 'chrome'

上面准备工作有点多,很多人看看就放弃了吧,以下继续。acceptance.suite.yml是Codeception测试框架中的一个配置文件,用于配置acceptance测试套件的相关设置。

在测试框架的配置文件(如acceptance.suite.yml)中,需要配置WebDriver相关的模块和参数。常见的配置项包括:

  • WebDriver模块:用于与WebDriver进行交互。
  • url参数:指定测试的URL地址。
  • browser参数:指定使用的浏览器类型(如Chrome、Firefox等)。
  • window_size参数:指定浏览器窗口大小。
  • capabilities参数:指定WebDriver的其他参数,如启用无头模式、设置代理等。

以下是我的参考配置:

yaml 复制代码
actor: AcceptanceTester
modules:
    enabled:
        - Filesystem
        - Asserts
        - WebDriver:
            url: 'http://127.0.0.1:91/'
            browser: 'chrome'
        - REST:
            # API 基础 URL
            url: /
            # 请求头信息
            headers:
            - {name: 'Content-Type', value: 'application/json'}
            # 响应断言
            depends: Yii2

WEB-UI自动化测试脚本开发

AcceptanceTester是Codeception测试框架中的一个actor(测试人员),用于执行web ui自动化测试。其原理主要包括以下几个步骤:

  1. 使用WebDriver模块启动浏览器,并打开测试网站。
  2. 使用页面对象模式(Page Object Pattern)定义页面元素和操作方法,以便在测试中调用。
  3. 在测试用例中使用AcceptanceTester对象调用页面对象的操作方法,执行自动化测试。
  4. 测试完成后,使用断言方法验证测试结果是否符合预期。
  5. 测试结束后,关闭浏览器。

总的来说,AcceptanceTester执行web ui自动化测试的原理是通过模拟用户在浏览器中的操作,自动化执行测试用例,并验证测试结果是否符合预期。这样可以大大提高测试效率和准确性,减少人工测试的工作量。

比如说我有这样一个页面,需要做这个页面做一个UI自动化测试

代码(部分):

php 复制代码
<?php
class PreviewCest
{
    //java -jar selenium-server-standalone-3.141.59.jar需要打开selenium服务,还有安装谷歌开展
    public $authId;
    public $attId;
    public $fileName;
    public $fileExt;
    public $fileSize;
    public $fileSizeFmt;
    public function _before(AcceptanceTester $I){
         $config = require(__DIR__ . '/../../config/test.php');
         new \yii\web\Application($config);
         //忽略一些代码
    }
    protected function alertAction(AcceptanceTester $I, $content, $wait = 1){
        $I->executeJS("alert('Testing ".$content."');");
        $I->wait($wait);
        $I->acceptPopup(); // 点击弹窗上的"确认"按钮
    }
    public function previewFileName(AcceptanceTester $I)
    {
        $I->wantTo('打开预览页面,查看文件名称');
        
        //打开预览页面
        $I->amOnPage('/preview?id=' . $this->authId);

        $this->alertAction($I, '打开预览页面,查看文件名称是否正确');

        $I->see($this->fileName.'.'.$this->fileExt. '('.$this->fileSizeFmt.')', ['css'=>'.top-div-filename']);

        $I->see('如果页面提示签名过期,请点击这里', ['css' => 'body .top-div-info']);
        
        $I->wait(3);


        $iframe = $I->grabMultiple('iframe', 'src');

        // 获取 src 属性的值
        $src = $iframe[0];
        $I->assertNotEmpty($src, 'src should not be empty');

        $this->alertAction($I, '加载iframe src内容,请求src中链接内容');

        //加载iframe src内容
        $I->amOnUrl($src);
        $I->wait(1);

        $iframe = $I->grabMultiple('iframe', 'src');
        $src = $iframe[0];
        $I->assertNotEmpty($src, 'src should not be empty');

        $content = file_get_contents($src);

        $I->assertNotEmpty($src, $content);

        $this->alertAction($I, 'end');

    }
}

执行以下命令即可运行测试:(注意acceptance大小写)

arduino 复制代码
php vendor/bin/codecept run acceptance

或者

php vendor/bin/codecept run acceptance PreviewCest

执行效果截图:

代码覆盖率测试

前提是需要下载Xdebug扩展。

在项目的根目录下,有一个名为 codeception.yml 的文件,并添加以下内容:

bash 复制代码
actor: Tester
paths:
    tests: tests
    log: tests/_output
    data: tests/_data
    helpers: tests/_support
bootstrap: _bootstrap.php
settings:
    memory_limit: 1024M
    colors: true
    logging:
        enabled: true
        level: 'debug'
        path: 'tests/_output/debug.log'
modules:
    config:
        Yii2:
            configFile: 'config/test.php'
            cleanup: false

# To enable code coverage:
coverage:
   #c3_url: http://localhost:8080/index-test.php/
   enabled: true
   #remote: true
   #remote_config: '../codeception.yml'
   include:
        - controllers/*
        - biz/*
        - models/*
        - common/*
   exclude:
        - runtime/*
        - /views/*
        - tests/_output/*
        - tests/_support/*
        - tests/_data/*
        - tests/_envs/*

在上述配置中,我们启用了代码覆盖率测试,并指定了需要覆盖的代码文件和需要排除的文件。

启动测试

在终端中,进入项目的根目录,并运行以下命令:

css 复制代码
 php vendor/bin/codecept run unit  --coverage --coverage-html

会生成一个测试报告内容文件,目录为tests/_output/coverage,打开

输出报告

css 复制代码
php vendor/bin/codecept run Unit --debug --html

执行run 可配置输出报告参数,官网链接查看codeception.com/docs/Report...

清晰的报告提供了系统当前状态的全貌。哪些测试通过了,哪些测试失败了,如果失败的原因是什么。报告的详细程度和收集的技术信息各不相同。Codeception 提供内置报告器和可定制的 API,以便创建自己的报告器。

比如我经常使用的,可查看代码执行过程中你程序输出的埋点日志,比如Yii框架就是Yii:info("this is a info");最后还有一个html的测试结果报告,一般报告文件路径在tests/_output/report.html

如何优化测试的流程和效率

自动化测试

可以大大提高测试效率,减少测试时间和人力成本。使用自动化测试工具,可以快速执行大量的测试用例,自动化检查应用的各种功能和性能,同时也可以减少人为错误的发生。例如本文的API测试、WEB-UI自动化测试(Acceptance测试)

持续集成和持续交付

持续集成和持续交付可以帮助我们在开发过程中及时发现问题,减少测试的工作量。通过持续集成,可以将代码自动集成到主干分支,并进行自动化测试,及时发现和解决问题。持续交付则可以将代码自动部署到生产环境中,减少手动操作的错误和延迟。例如gitlab-ci做持续交付,执行单元测试、代码覆盖率检测。后续大家有需要出一期内容(埋坑)。

结语

总之,测试是保证应用质量的重要环节,而Codeception则是一个强大的测试工具,可以帮助我们轻松实现全面、高效的测试。在开发过程中,我们应该始终保持测试意识,注重测试的质量和效率。同时,也要不断学习和探索,不断优化测试流程和技术,以提高应用的质量和稳定性。希望大家多多关注这一类的话题,共同探讨和分享测试的经验和技巧,让我们的开发工作更加高效、优秀!

相关推荐
lyrhhhhhhhh31 分钟前
Spring框架(1)
java·后端·spring
西洼工作室1 小时前
掌握单元测试:提升软件质量的关键步骤
java·单元测试
喝养乐多长不高2 小时前
Spring Web MVC基础理论和使用
java·前端·后端·spring·mvc·springmvc
莫轻言舞2 小时前
SpringBoot整合PDF导出功能
spring boot·后端·pdf
玄武后端技术栈3 小时前
什么是死信队列?死信队列是如何导致的?
后端·rabbitmq·死信队列
老兵发新帖4 小时前
NestJS 框架深度解析
后端·node.js
码出钞能力5 小时前
对golang中CSP的理解
开发语言·后端·golang
金融数据出海6 小时前
黄金、碳排放期货市场API接口文档
java·开发语言·spring boot·后端·金融·区块链
豌豆花下猫6 小时前
Python 潮流周刊#101:Rust 开发的 Python 类型检查工具(摘要)
后端·python·ai
gxn_mmf7 小时前
典籍知识问答模块AI问答功能feedbackBug修改+添加对话名称修改功能
前端·后端·bug