验收测试 - 断言大全

  • 作者:KK

  • 发表日期:2015.12.13


好了其实各种see,dontSee,click,grabTextFrom这些方法都是断言方法,当它们期望的东西执行不成功时就会停止运行,跟单元测试里的assert系列断言方法的效果是一样的

其实有经验的人士应该想像得出来,就是通过curl把目标网站的源代码下载来,再往里面搜索字符串这样实现断言的

那么我们要针对页面测试时都能执行哪些断言呢?这实在是太多啦,抱歉我还没有精力把全部翻译并列出来,其实你可以查看tests/acceptance/AcceptanceTester.php这个文件的类里的方法,默认情况下它的所有方法就是可以使用的断言方法,比如开头你应该能看到一个叫setHeader的方法,则在编程时可以使用

$I->setHeader('content-type', 'application/json')

而不用像单元测试那样要调用$this->tester

接下来我主要介绍几个可能经常用得到的方法,大家可以参考这几个方法去理解其它类似的方法,毕竟不是全部人都能看懂官方那个类里面自带的英文注解的~

  • amOnPage($url) 将当前页面切换到指定的URL,这个url可以是完整的URL也可以是一个相对URL

  • amOnUrl($url) 切换当前基础网址,本身我们 $I->amOnPage('/index.html') 的话会默认相对于yml配置里的URL的嘛,现在如果通过这个方法切换成别的URL,则后面所有 amOnPage 方法的相对URL都是相对于这个新的URL,可以说是动态修改那个URL配置了,仅限该测试用例的当前会话生效,运行结束后下一个测试用例无效

  • see($text, $selector = null) 断言页面上会存在$text这个参数的字符,如果指定$selector的话则会在$selector里面查找这个字符

  • canSee($text, $selector = null) 跟see方法一样是查找文本的,但是如果找不到文本却不会停止运行,还有其它很多can开头的方法名称,都是断言失败不停止的方法,但失败会产生在报告里

  • click($link, $context = null) 点击一个链接,这样会导致当前页面变更哦

    $link参数可以是a标签里的文字,也可以是选择器

    但是其实如果button的name或value的值符合$link的话都会被定位到哦

    对于img标签则会把alt属性也加入匹配定位的内容中

    最后呢如果匹配到的是一个type=submit的button的话则会同时触发表单的提交

  • fillField($field, $value)name="$field"这个表单项填充$value这个值

    比如你有一个注册页,用select控件来选择性别,value=2就是女性

    $I->fillField('sex', 2);		//选择女性
    
  • seeInField($field, $value) 断言name="$field"的表单项的value值与$value是匹配的

    接上面fillField的例子,默认性别是未知,value是0,做一个表单修改的测试

    $I->seeInField('sex', 3);	//断言默认是3
    $I->fillField('sex', 2);		//填充2
    $I->seeInField('sex', 2);	//断言填充后就是2,但实际是填充后再断言,在基础的验收测试里意义不大,用在后面的WebDriver验收测试中才最能彰显测试效果
    
    $I->amOnPage('/user-center.html');	//假如切换到注册页面
    $I->seeInField('username', '请填写用户名');	//断言用户名的默认值
    
  • seeCheckboxIsChecked($checkbox) 断言$checkbox所指的勾选项是已经勾选了的($checkbox也是一个选择器!个人觉得该参数应该命名为$selector)

    然后如果要断言是未勾选的就是用dontSeeCheckboxIsChecked($checkbox)

  • submitForm($selector, $params, $button = null) 将$selector选中的表单发起提交,$params是key => value表达的表单参数值,这样你就不需要慢慢用 $I->fillField 这些方法来填充表单而是在这里直接传递参数了, $button 是提交按钮的选择器,可以不填,但如果存在 修改/删除 等多个提交按钮时就需要用 $button 了

  • seeCookie($name) 断言存在指定$name的Cookie

  • resetCookie($name) 删除cookie

    断言没有指定Cookie的话当然也是用dontSeeCookie($name)了,其实好多see方法都有一个对应的dontSee方法和canSee方法

  • canSeePageNotFound 断言当前是404页面,之前的例子里你有见过,我这里不举例了

  • grabValueFrom($field) 获取HTML中name="$field"这个表单项的值,但这里要注意,这个表单项必须要被form标签包起来哦,我试过有一次对一个select标签的值死活取不出来,后来发现form里的能拿出来,于是才注意到有这个...

    而关于这个方法的使用嘛,我要举一下例子,为什么呢?因为验收测试中默认是没有assert系列的断言方法的!你想想喔,如果你想测试的页面是一个注册页,用select控件来选择性别,默认是未知,value是3,然后你想测试时确认这个值默认是3怎么办?我认为只能这样:先通过grabValueFrom方法将表单值获取出来,再用断言方法断言这个值,代码如下:

    //顶上要 use \Codeception\Module\Asserts;
    
    $gender = $I->grabValueFrom('sex');
    Asserts::assertEquals(3, $gender);
    

    这样来断言,其实之前的例子有刻意添加过这个演示代码,具体嘛,将会在 验收测试 - 扩展 章节中解释,反正如果你要断言的话就要引用Asserts,然后再通过静态方法来调用断言方法,它的断言方法和PHPUnit差不多

  • amOnSubdomain($subdomain) 切换到子域名,比如配置时URL是 qq.com,或者 www.qq.com, 又或者是 shop.qq.com ,执行

    $I->amOnSubdomain('pay');
    

    则是意味着

    $I->amOnPage('/xxx.html');
    

    会切换到 http://pay.qq.com/xxx.html