欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

解决SimpleTest 1/2 test cases complete的问题

程序员文章站 2024-01-14 21:51:40
...

最近一直在用SimpleTest测试代码,发现这个问题其实已经很久了,但一直因为无关痛痒没有去解决,今天终于憋足劲把它搞定了,把过程写出来给大家分享:) 复现问题 首先新建一个test.php,内容如下: 现在执行这个测试,你会发现test cases complete的数字不

最近一直在用SimpleTest测试代码,发现这个问题其实已经很久了,但一直因为无关痛痒没有去解决,今天终于憋足劲把它搞定了,把过程写出来给大家分享:)

复现问题

首先新建一个test.php,内容如下:

解决SimpleTest 1/2 test cases complete的问题

现在执行这个测试,你会发现test cases complete的数字不对劲。显示的TestCase总数多于真实的TestCase数量。如下图:

解决SimpleTest 1/2 test cases complete的问题

排查原因

Google无果后,只能自己排查SimpleTest源码了。先在项目里搜索”test cases complete”,定位到reporter.php:

解决SimpleTest 1/2 test cases complete的问题

分别追踪$this->getTestCaseProgress()和$this->getTestCaseCount(),前者的数量和实际使用的TestCase数量符合,所以判定问题出在后者。

后者返回的是SimpleScorer::$size,这个属性在新建SimpleScorer实例时被初始化为null,在TestSuite::run()时通过SimpleScorer::paintGroupStart()被赋值为TestSuite::getSize():

解决SimpleTest 1/2 test cases complete的问题

此时将$this->cases输出,可以看到不仅有自己编写的TestCase,还有基类WebTestCase。

解决SimpleTest 1/2 test cases complete的问题

究其原因,这些类是通过SimpleFileLoader::createSuiteFromClasses()从文件中解析出来的,但基类WebTestCase并不包含实际的测试代码,却被计入了TestCase总数。

在TestSuite::getSize()中有个判断,如果SimpleTest::isIgnored( $case )为true,则不增加$count。但是遗憾的是SimpleTest默认的IgnoreList居然是空的,不包含自己提供的WebTestCase、UnitTestCase等基类:

解决SimpleTest 1/2 test cases complete的问题

解决方案

找到原因之后,解决问题就很简单了。在代码中自己用SimpleTest::ignore()将WebTestCase添加到IgnoreList即可:

解决SimpleTest 1/2 test cases complete的问题

再执行测试,大功告成!

解决SimpleTest 1/2 test cases complete的问题