验收测试 - 断言变量

  • 作者:KK

  • 发表日期:2015.12.13


验收测试针对页面进行测试,一般情况下更多的是$I->see('文本')断言页面上有特定的文本,或者$I->seeElement('#xxx')这样有特定的dom元素,但有时候我们要断言一些变量的值,你想使用$I->assertEqual(3, $var)默认情况下那可不行,因为验收测试是使用PhpBrowser模块实现的,而这个模块并没有assert系列的方法,所以AcceptanceTester测试器自然就没有assert方法,$I变量也就调用不了这些方法咯

要让测试器拥有类似单元测试的断言方法,需要修改acceptance.yml添加Asserts模块,但这里添加模块的时候要注意一下配置文件

回顾一下单元测试的模块配置,是这样的吧:

enabled: [Asserts, UnitHelper]

这样表示单元测试引入了两个模块,但是验收测试就不同了,它的enabled配置名称后面没有用方括号包住两个模块,而是分成两行,这样:

enabled:
    - WebDriver
    - AcceptanceHelper

这样和方括号是一样效果的,大家完全可以修改成

enabled: [WebDriver, AcceptanceHelper]

所以如果不修改的话,要添加Asserts模块则是在下面增加一行- Asserts即可

接下来配置好之后请务必记得重构测试器,然后就可以执行$I->assertEquals(3, 3)这样了


然并卵

虽说引入这个Asserts模块后使得验收测试既能断言dom又能断言变量,但是实际上你会发现$I->assertInternalType('string', $str)的时候就会报错说你调用了一个不存在的方法,这难道不是已经引入了Asserts模块了吗?

是的,你是引入了,但是很抱歉地告诉你,这个Asserts其实只有二十个断言方法左右.它并不拥有PHPUnit框架的所有断言方法.

而单元测试里之所以能用那么多断言方法是因为它是继承了PHPunit的断言类,但这个Asserts模块并不继承于它,有兴趣的朋友可以看看Codeception的源代码.

那又不提供所有PHPUnit的方法,要用到的时候没得用,这算啥呢?

我只能希望框架开发团队未来能完善这个断言模块吧,其实这个Assert模块直接继承PHPUnit的类多好,这样就全部拥有了~浅见而已,他们不这样做是不是有别的原因咧?


来点实际的

上面我只是告诉大家一些真相,然而大家无论知不知道,反正不用那个Assert模块就不会有啥问题,但是在验收测试的时候,我们还是有必要去断言变量的,既然Asserts模块不能给到我们全部,我们就找PHPUnit就行了

Codeception已经将PHPUnit集成在里面了,因此我们随时可以调用PHPUnit的断言功能.为了方便,我们在使用之前先在顶上声明use PHPUnit_Framework_Assert;

然后就可以

PHPUnit_Framework_Assert::assertTrue(1 == 2);
PHPUnit_Framework_Assert::assertEquals(2, 2);
PHPUnit_Framework_Assert::assertInternalType('string', 'abc');

而后面的验收测试代码中我们偶尔还真的需要使用它去帮我们断言一些变量