2009-07-26 72 views

回答

2

是的,这应该可以通过从Ant脚本调用testsuite shell脚本(cake testsuite app all,可用选项的概述查看脚本的帮助输出)来实现。

+0

如果测试用例失败,您知道如何使ANT构建失败吗? – codegy 2009-07-26 11:57:45

+0

我自己不使用Ant,但是您是否设置了failonerror属性? – dhofstet 2009-07-27 05:44:41

1

随着新的东西简单地调用cake testsuite app all 是不会工作,特别是如果你想从命令行执行它。互联网将向你展示创建分组套件的十亿个例子,但没有任何东西像网络界面那样运行它,但是等待我忘记了在php中的常见做法就是无缘无故地做了大量的额外工作。你知道你需要逐行输入你的测试套件的每个测试文件集。

来自java背景我喜欢你如何可以按一下按钮来运行所有测试,所以我做了一些小事来简化一切。

此解决方案意味着您不能再制作测试套件,并期望它们能够在其他地方汇总测试。你不得不制作套房。或者以不同的方式命名它们并隐藏它们。但是,嘿,没关系,因为权衡是值得的。

确保正确命名文件 - > AllTestsTest.php

在我的案例文件夹我创建了一个使用递归目录查找一个测试套件文件。

<?php 
/** 
* AllTests class 
* 
* This test group will run all tests. 
* 
* @package  Cake.Test.Case 
*/ 
class AllTestsTest extends CakeTestSuite { 

/** 
* Suite define the tests for this suite 
* 
* @return PHPUnit_Framework_TestSuite the instance of PHPUnit_Framework_TestSuite 
*/ 
     public static function suite() { 
       $suite = new CakeTestSuite('All Tests'); 

       $path = dirname(APP_TEST_CASES); 

       $suite->addTestDirectoryRecursive($path); 

       return $suite; 
     } 
} 

下一步需要在lib/Cake/Console/Command/TestShell.php中更改cake代码。

@@ -52,9 +52,10 @@ 
     public function addTestDirectoryRecursive($directory = '.') { 
       $Folder = new Folder($directory); 
       $files = $Folder->tree(null, true, 'files'); 
- 
+     
       foreach ($files as $file) { 
-      if (substr($file, -4) === '.php') { 
+       
+      if (substr($file, -8) === 'Test.php' && substr($file, -13) != 'TestsTest.php') { 
           $this->addTestFile($file); 
         } 
       } 

这是一个黑客,但它解决了两个问题,以至于我不能停止咧嘴笑。

而不是捕获任何扩展名为.php的文件,它实际上遵循了Web界面使用的约定。这将允许您在Web界面中单击运行AllTests,并且Web测试运行器的行为与运行时的cli测试相同。

测试如何汇总的标准化对于精彩人物的代码贡献蛋糕社区而言确实是一种事后考虑。

现在,我知道你在想..“为什么不扩展CakeTestSuite并重写该方法?”祝你好运。你的旅费可能会改变。 Cake并不像Java或其他编译语言那样是真正的面向对象,而Cake的扩展方式意味着坚持那些几乎没有记录的惯例。

此更改强制使用模式blahblahtest.php的为测试运行/加载在所有可能的测试平台的公约,因为没有办法合并单独的测试套件在一起,没有代码明确行,因为天才的决定,任何.php文件是一个测试,即使它真的是一个测试套件。

为什么phpUnit社区没有想出一种聚合测试套件的方式,而无需编写任何东西?这是大多数语言的基本功能,约定优于配置权限?目录/软件包结构决定了组成,为什么不利用如此明显的优势? Cake的开发者有这么多的机会让它成为可能,但我想他们喜欢在每个套件的每个测试用例中逐行输入,就好像这是一件有趣的事情一样。Typey tappy typey typey

例如这里的Cake核心AllTests.php文件是他们用于一体的。

class AllTests extends PHPUnit_Framework_TestSuite { 

/** 
* Suite define the tests for this suite 
* 
* @return void 
*/ 
    public static function suite() { 
     $suite = new PHPUnit_Framework_TestSuite('All Tests'); 

     $path = CORE_TEST_CASES . DS; 

     $suite->addTestFile($path . 'BasicsTest.php'); 
     $suite->addTestFile($path . 'AllConsoleTest.php'); 
     $suite->addTestFile($path . 'AllBehaviorsTest.php'); 
     $suite->addTestFile($path . 'AllCacheTest.php'); 
     $suite->addTestFile($path . 'AllComponentsTest.php'); 
     $suite->addTestFile($path . 'AllConfigureTest.php'); 
     $suite->addTestFile($path . 'AllCoreTest.php'); 
     $suite->addTestFile($path . 'AllControllerTest.php'); 
     $suite->addTestFile($path . 'AllDatabaseTest.php'); 
     $suite->addTestFile($path . 'AllErrorTest.php'); 
     $suite->addTestFile($path . 'AllEventTest.php'); 
     $suite->addTestFile($path . 'AllHelpersTest.php'); 
     $suite->addTestFile($path . 'AllLogTest.php'); 
     $suite->addTestFile($path . 'Model' . DS . 'ModelTest.php'); 
     $suite->addTestFile($path . 'AllRoutingTest.php'); 
     $suite->addTestFile($path . 'AllNetworkTest.php'); 
     $suite->addTestFile($path . 'AllTestSuiteTest.php'); 
     $suite->addTestFile($path . 'AllUtilityTest.php'); 
     $suite->addTestFile($path . 'AllViewTest.php'); 
     $suite->addTestFile($path . 'AllI18nTest.php'); 
     return $suite; 
    } 
} 

臭臭臭臭......

他们有一个良好的开端与递归目录读者,但是,可能会释放一些宝贵的时间,为地球的其他部分直观的惯例,同意完全是出于我想这个问题。 PHP程序员...... meh

进行上面的修改是无害的,它可以使运行测试变得非常简单,而无需逐行调用每行必须逐行写入的测试套件。像编写测试的Cake人一样。

如果你正在运行一个jenkins构建这个解决方案是如此之大,因为你只需要运行一个ant任务而不是多个显式套件。如果你已经花时间逐行​​创建测试套件,你可以尝试像我一样黑客入侵相同的文件,但它不会与浏览器测试运行器匹配。

这基本上强制你的shell遵守Test.php的约定,而不是遵循破坏约定的事情,当我想做一些像RUN ALL TESTS一样简单的事情时。就好像为CakePHP编写测试的人决定他们永远不会为使用该框架的cakephp应用程序编写测试,在持续集成平台,基于浏览器的测试运行程序以及在windows或nix中使用独立cli一起使用它。这是一个肯定的阴谋。

运行测试只是这样做

$蛋糕测试程序AllTests中< - 俊俏是不是。它非常直观,并且可以工作,并且您没有经历将每个测试添加到套件中的麻烦。现在你的蚂蚁目标可以像馅饼一样简单。

<target name="phpunit" description="Run All The Cake Tests Like A Boss" depends="ensure-tmp-folders"> 
    <exec executable="bash" failonerror="true" dir="${basedir}/src/app/Console"> 
    <arg value="cake"/> 
    <arg value="-app"/> 
    <arg value="${basedir}/src/app"/> 
    <arg value="test" /> 
    <arg value="app"/> 
    <arg value="AllTests" /> 
    <arg value="--coverage-clover"/> 
    <arg path="${basedir}/build/logs/clover.xml"/> 
    <arg value="--log-junit"/> 
    <arg path="${basedir}/build/logs/junit.xml"/> 
    </exec> 
</target> 

当你在你的代码检查和构建服务器通知你,你的测试,而不是失败的从来不知道它,因为你忘了要经过它添加到一个套件,你可以在你的老板火灾之前将其修复过程您。