背景
在程序员日常开发中,测试是一个不可或缺的环节。然而,很多开发者往往忽视了测试的重要性,导致应用的质量不尽如人意。尤其是在大型项目中,测试的工作量更是庞大,难以胜任。因此,如何打造高质量的应用,从测试开始就成为了一个关键问题。在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自动化测试。其原理主要包括以下几个步骤:
- 使用WebDriver模块启动浏览器,并打开测试网站。
- 使用页面对象模式(Page Object Pattern)定义页面元素和操作方法,以便在测试中调用。
- 在测试用例中使用AcceptanceTester对象调用页面对象的操作方法,执行自动化测试。
- 测试完成后,使用断言方法验证测试结果是否符合预期。
- 测试结束后,关闭浏览器。
总的来说,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则是一个强大的测试工具,可以帮助我们轻松实现全面、高效的测试。在开发过程中,我们应该始终保持测试意识,注重测试的质量和效率。同时,也要不断学习和探索,不断优化测试流程和技术,以提高应用的质量和稳定性。希望大家多多关注这一类的话题,共同探讨和分享测试的经验和技巧,让我们的开发工作更加高效、优秀!