2014-10-22 191 views
1

我想用PHP中的Behat来近似测试行为的覆盖率。Behat的行为测试覆盖率

很明显,与代码覆盖率不同,行为覆盖并不是精确可量化的,然而,我们可以知道我们从一开始就计划采用哪些行为。例如,我们可能知道用户可以1)购买产品,2)评论产品。为此,我们希望编写两个BDD测试。

首先,我们可以创建占位符并使用标准的@wip标记将每个测试标记为正在进行的工作。

我有两个相关的问题:

是否有可能有贝哈特报告的场景的总数,以及场景的总数量与给定的标签(即@wip)?

即使您使用过滤器“〜@ wip”忽略这些测试,Behat是否可能知道计数?

+1

http://tech.vg.no/2014/01/21/generating-code-coverage-of-behat-tests/但它看起来有点hacky – 2014-10-22 16:45:26

+0

这是为了覆盖已知的行为,而不是覆盖代码。但是,如果我没有时间写出单元测试,那么以这种方式进行覆盖是很好的了解。 :) – DanielM 2014-10-23 08:23:07

回答

0

您可以使用挂钩获取有关方案的信息,包括其标签,但只能在@beforeFeature@beforeSuite中执行此操作。

不幸的是,这意味着它不会报告标签被过滤掉的情况。

这是我最初的解决方案。

class Context extends BehatContext { 

    protected static $scenarioCount = 0; 

    protected static $scenarioCountWip = 0; 

    /** 
    * Count scenarios and WIP 
    * @BeforeScenario 
    */ 
    public function countScenario(Behat\Behat\Event\ScenarioEvent $scenario) 
    { 
     self::$scenarioCount++; 
     if(in_array('wip', $scenario->getScenario()->getTags())) { 
      self::$scenarioCountWip++; 
     } 
    } 

    /** 
    * @AfterSuite 
    */ 
    public static function coverageReport() 
    { 
     echo 'Scenarios:  '.self::$scenarioCount.PHP_EOL; 
     echo ' - in progress: '.self::$scenarioCountWip.PHP_EOL; 
     echo ' - coverage: '.(100/self::$scenarioCount)*(self::$scenarioCount-self::$scenarioCountWip).PHP_EOL; 
     echo PHP_EOL; 
    } 

} 

特征文件:

Feature: Test Count 

    @wip 
    Scenario: Work in progress 

    @someTag 
    Scenario: Scenarion with tag 

    Scenario: Final scenario 

结果运行的所有测试时:

Feature: Test Count 

    @wip 
    Scenario: Work in progress 

    @someTag 
    Scenario: Scenarion with tag 

    Scenario: Final scenario 

Scenarios:  3 
- in progress: 1 
- coverage: 66.666666666667 

3 scenarios (3 passed) 
No steps 

这个结果丝毫@wip过滤掉:

Feature: Test Count 

    @someTag 
    Scenario: Scenarion with tag 

    Scenario: Final scenario 

Scenarios:  2 
- in progress: 0 
- coverage: 100 

2 scenarios (2 passed) 
No steps 

我我希望这个问题能够公开有人找到更好的解决方案。