验收测试 - 试着写几个行为

  • 作者:KK

  • 发表日期:2015.12.13


回顾之前入门的几个代码,我们大概翻译一下它(如果我翻译不准也不许投鸡蛋!)

use project1_tests\AcceptanceTester;		//引用这个“验收测试者“类
$I = new AcceptanceTester($scenario);	//实例化一个测试者,将全局变量$scenario传进去作为构造参数
$I->wantTo('perform actions and see result');	//我想执行一些动作并且看看结果
$I->amOnPage('/');	//我在 / 这个页面
$I->see('我叫KK');	//我看到“我叫KK"这串文字

发现没有,那些代码好像在讲英语一样耶,我想你可能是第一次接触这样有趣代码对吗!?至少我就是第一次在这个框架里接触这样的代码!太有创意了哈哈

Codeception在验收测试方面,定义了一个叫测试者的概念,就是上面new的那个类,一般测试者的实例变量名都叫$I,然后要测试的事情抽象出一个动词出来作为方法名称,比如see方法,就形成了$I->see($字符串)这样的代码,看着好像读英语一样。在英文文档中这个测试者应该叫Actor(演员/行动者?)


开始编码

好了概念说到这里,将以下代码贴进之前的测试用例里,覆盖掉原有的代码吧亲!

use project1_tests\AcceptanceTester;		//引用这个“验收测试者“类
$I = new AcceptanceTester($scenario);	//实例化一个测试者,将全局变量$scenario传进去作为构造参数
$I->wantTo('perform actions and see result');	//我想执行一些动作并且看看结果
$I->amOnPage('/');	//我在 / 这个页面
$I->see('我叫KK');	//我看得到“我叫KK"这串文字
$I->click('文章');	//我击带有“文章“这两个字的链接
$I->seeCurrentUrlEquals('/article/list.html');	//我看到当前网址是'/article/list.html'
$I->dontSee('我叫KK');	//我不想看到“我叫KK"这串文字
$I->seeElement('.pArcList');	//我看到class="pArcList"的一个元素
$menuText = $I->grabTextFrom('nav li:nth-child(3) a');	//我通过 nav li:nth-child(3) a 这个CSS选择器定位到一个元素并捕捉它里面的文本
\Codeception\Module\Asserts::assertEquals('心情', $menuText);	//调用断言模块断言变量
$I->click('nav li:nth-child(55) a');
$I->dontSeeCurrentUrlEquals('/article/list.html');	//我不想看到当前的网址是'/article/list.html'
$I->seeInTitle('音乐厅');	//我能在title里看到'音乐厅'三个字

$I->amOnPage('/about.html');	//我在'/about.html'这个页面
$I->seeNumberOfElements('.wrapTabContent', 3);	//我看到3个class="wrapTabContent"的元素

$I->amOnPage('/xxxxx.html');	//我在 '/xxxxx.html' 这个页面
$I->seePageNotFound();	//我看到页面不存在的错误(根据返回状态码是否404判断)

好了就写这么多代码先吧,你大概都能看懂,然后运行一趟,它提示

Trying to perform actions and see result (IndexPageCept)...

等了一会,报告OK (1 test, 9 assertions),结果全部测试通过了


看看失败的后果

然后你将中间那个$I->seeElement('.pArcList');修改成$I->seeElement('.xxxxx');,当然你也知道会运行失败,只是咱们看看它测试失败的报告是啥样子。..运行后报告内容大概是这样的:

1) Failed to perform actions and see result in IndexPageCept (E:\project1-tests\tests\acceptance\IndexPageCept.php)
Couldn't see element ".xxxxx":
Element located either by name, CSS or XPath '.xxxxx' was not found on page.

Scenario Steps:
6. I see element ".xxxxx"
5. I don't see "我叫KK"
4. I see current url equals "/article/list.html"
3. I click "文章“
2. I see "我叫KK"
1. I am on page "/"

可以说整份失败报告的信息都很有用

第1行告诉你哪个测试用例失败了(因为有时会同时运行多个测试用例,你需要知道在哪个失败了)

第2行告诉你失败原因

第3行进一步提示原因的细节

接下来就是Scenario Steps:栏目,它下面有6个运行步骤倒序排列,表示它从第1个测试动作运行到第6个动作,然后在第6个动作失败了


调试和查看测试进度

关于调试,其实跟单元测试里的调试一模一样,都要靠codecept_debug函数来输出调试数据,并且在运行时增加--debug参数

查看测试进度这个嘛,就是因为做这个验收测试一般会比单元测试慢很多,毕竟它要通过HTTP请求获取目标页面的内容,再从内容中搜索各种要see的东西,于是一个完善的验收测试跑下来你都要等老久,有时候你想知道它现在到底运行到哪了,则可以加上--steps参数,实例:

#可以多个运行参数一起上的!
php E:\codecept.phar run acceptance IndexPageCept --debug --steps --json

这样运行的时候它会每跑一个动作都在控制台有一个输出,告诉你它现在就在测试这个东西