在java里面做单元测试倒是比较方便,但是PHP里面的话,可能大多数人都很少用到单元测试,最多就是运行一下程序,没问题就OK了,不过如果想要项目能长期良好地维护的话,就需要做一个功能,测试一下,以保证代码的健康程度。这里就需要用到单元测试,这几天学习了behat后,在这里做一个笔记。

1:我是使用的composer进行安装的,可以创建一个文件夹,我这里是 “test”。进入到test文件夹里,执行composer命令

composer require --dev behat/behat

这里推荐使用阿里云的composer镜像(因为使用默认的镜像实在是太慢了):

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

2:composer执行完以后,目录结构是这样的:

接下来就需要使用behat的命令去初始化一个单元测试。如果是windows的话,可以打开PowerShell,进入到test目录,也就是当前单元测试的根路径,然后执行:

./vendor/bin/behat --init

如果结果如图所示,那证明成功了

可以再看看执行后的目录,应该就是这样的

程序会自动生成一个默认的文件 

咱们还需要写一种语言,用于behat识别、生成、执行。官方给的说法叫做 “Gherkin Language”,翻译成中文叫 小黄瓜语言?有点不太清楚。来看看这玩意儿该怎么写吧

首先我们需要在features文件夹下创建一个.feature文件,我这里叫 test.feature。如下图

然后该怎么写?有一个固定的格式,照着下面写即可:

Feature: xxxxxxxxxxxxx......
  Additional text...
  Scenario: Some determinable business situation
    Given some precondition
    When some action by the actor
    Then some testable outcome is achieved

也就是说,这里面有关键词:Feature,Scenario,Given,When,Then。写的时候至少要有这些词,一个词代表一个步骤,也就是php里面对应的一个方法。当然,我们写的时候肯定不可能就只有Given、When、Then这三个方法,所以如果某一个步骤比较多,可以在下方写 And 增加步骤,例如下面:

Feature: xxxxxxxxxxxx.......
  Additional text...
  Scenario: Some determinable business situation
    Given some precondition
    And some other precondition
    When some action by the actor
    And some other action
    And yet another action
    Then some testable outcome is achieved
    And something else we can check happens too

好了,下面我根据这个格式来写一个自己的Feature

然后,我们可以先执行一下命令看看是什么效果

./vendor/bin/behat

红框里说的是没有生成代码段,是哪里的代码段?可以打开FeatureContext.php看看,里面只有一个构造方法

我们可以在PowerShell里面输入1,behat会自动地把缺失的方法打印到PowerShell里面

然后把生成的代码复制到FeatureContext.php里面即可。不过还有一种更简单的方法,也是官方提供的方法,运行下面命令,选择1,就可以直接在FeatureContext.php里面生成代码了。

./vendor/bin/behat --dry-run --append-snippets

接下来看看FeatureContext.php,就能看到对应的3个方法了

如果你仔细看的话,这三个方法名,就是对应的test.feature里面的Given、When和Then。

好了,目前测试的框架就基本上搭建好了,咱们可以写一个单元测试来看看。我写了两个类

然后将这两个类的逻辑填充到FeatureContext.php里面即可。

所有的流程都已经准备完毕,咱们运行一下,看看效果:

./vendor/bin/behat

可以看到下图,程序分别执行了thereArePeaches、iEatPeaches和howManyPeachesAreLeft,然后得出的结果为15

你也可以在 test.feature 里面修改一下参数,例如把5改成13,再运行试试看

Feature: test eat peach
  Scenario: There some peaches,
    eat a certain number of peaches and check the number of remaining peaches
    Given There are 20 peaches
    When I eat 13 peaches
    Then How many peaches are left

这样一个基本的单元测试就完成啦

发表评论

电子邮件地址不会被公开。 必填项已用*标注