验收测试 - 试着写几个行为 ¶
作者: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
这样运行的时候它会每跑一个动作都在控制台有一个输出,告诉你它现在就在测试这个东西