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

相关推荐
向前看-7 小时前
验证码机制
前端·后端
超爱吃士力架8 小时前
邀请逻辑
java·linux·后端
AskHarries10 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion11 小时前
Springboot的创建方式
java·spring boot·后端
程序猿000001号12 小时前
探索Python的pytest库:简化单元测试的艺术
python·单元测试·pytest
zjw_rp12 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder12 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
凌虚13 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
机器之心14 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
.生产的驴14 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven