前言
前两篇文章介绍了安装和单元测试。
这篇文章我们来介绍Fixture概念和功能测试、验收测试。
功能测试和验收测试在Codeception中,部分代码和测试流程很相似,所以我们也来说一下功能测试和验收测试的区别。
Fixture概念
Fixtures 是测试中非常重要的一部分。他们的主要目的是建立一个固定/已知的环境状态以确保测试可重复并且按照预期方式运行。
Yii 提供一个简单可用的 Fixure 框架 允许你精确的定义你的 Fixtures 。
Yii 的 Fixture 框架的核心概念称之为 fixture object 。
一个 Fixture object代表一个测试环境的某个特定方面,它是 yii\test\Fixture 或者其子类的实例。 比如,你可以使用 UserFixture 来确保用户DB表包含固定的数据。 你在运行一个测试之前加载一个或者多个 fixture object,并在结束后卸载他们。
功能测试和验收测试的区别
功能测试 Functional Testing
功能测试主要用于测试我们是否创建了正确的产品,逐项测试各个功能。
对于这种类型的测试,要涵盖所有可能情景的测试用例,即使这种情况在“现实环境”中不太可能存在。当进行这种类型的测试时,我们的目标是最大的代码覆盖率。验收测试 Acceptance Testing
验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
这部分测试通常是与客户或内部测试人员合作完成的。
对于这种类型的测试,我们使用的测试用例涵盖了我们期望软件使用的典型场景。
该测试主要测试以下几个点
- 可靠性,可用性:压力测试
- 扩展性:负载测试进行验证。
- 可用性:界面是否符合用户习惯等
- 安全性:代码审计、入侵测试
- 可维护性:通过演示如何提供软件更新/补丁来验证。
- 可配置性:通过证明客户如何修改系统配置来满足他们的需求来进行验证。
功能测试
使用模版创建功能测试
同样的,我们使用模板来创建一个功能测试。1
codecept g:cest functional StudentCest
创建好的文件会在tests/functional下.内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace backend\tests;
use backend\tests\FunctionalTester;
class StudentCest
{
public function _before(FunctionalTester $I)
{
}
public function _after(FunctionalTester $I)
{
}
// tests
public function tryToTest(FunctionalTester $I)
{
}
}可以看到内容和之前创建的Test模板很像。
不同的是,这里的方法多了一个参数functionalTester。
其实这个参数就是我们在Codeception(二)里面所说的actor概念。传送门:点我跳转
配置
比如我们这里对登录功能做测试。需要使用到数据库,所以我们首先应配置数据库。修改config/test-local.php,如果我们项目中使用了多个数据库,也要配置多个db。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
return yii\helpers\ArrayHelper::merge(
require __DIR__ . '/../../common/config/test-local.php',
require __DIR__ . '/main.php',
require __DIR__ . '/main-local.php',
require __DIR__ . '/test.php',
[
'components' => [
'db' => [
'dsn' => 'mysql:host=localhost;dbname=yii2-test',
'username' => '',
'password' => '',
],
'db2' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2-test2',
'username' => '',
'password' => '',
'charset' => 'utf8',
],
],
]
);定义Fixture
定义Fixture,用于指定账号密码登录
修改刚才模板生成的文件,加入以下方法:1
2
3
4
5
6
7
8
9public function _fixtures()
{
return [
'user' => [
'class' => UserFixture::className(),
'dataFile' => codecept_data_dir() . 'login_data.php',
]
];
}
注:该方法会在Yii2::_before()里自动调用
然后我们需要在tests/_data文件夹下写入登录数据
/tests/_data/login_data.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
return [
[
'username' => 'erau',
'auth_key' => 'tUu1qHcde0diwUol3xeI-18MuHkkprQI',
// password_0
'password_hash' => '$2y$13$nJ1WDlBaGcbCdbNC5.5l4.sgy.OMEKCqtDQOdQ2OWpgiKRWYyzzne',
'password_reset_token' => 'RkD_Jw0_8HEedzLk7MM-ZKEFfYR7VbMr_1392559490',
'created_at' => '1392559490',
'updated_at' => '1392559490',
'email' => '[email protected]',
],
];
- 编写测试方法
1
2
3
4
5
6
7
8
9public function loginUser(FunctionalTester $I)
{
$I->amOnRoute('site/login');
$I->fillField('LoginForm[username]', 'erau');
$I->fillField('LoginForm[password]', 'password_0');
$I->click('login-button');
$I->see('退出 (erau)');
$I->dontSeeLink('登录');
} - 运行功能测试
1
codecept run
一些其它说明
_before的使用
比如我们在做登录功能测试时,不仅要测试正确的账号密码是否可以登录,还要考虑用户名密码为空时,是否会显示用户名密码不能为空这样的提示。
也要测试错误的密码是否会提示密码错误。这就需要我们每次测试之前跳转到登录页面。因此可以写如下代码,每次测试时,恢复路由。
1
2
3
4public function _before(FunctionalTester $I)
{
$I->amOnRoute('site/login');
}
验收测试
验收测试编写流程和功能测试大体相同,不再赘述。
文章评论