2011-08-04 69 views
13

我正在尝试为大量代码更改不可用的应用程序编写单元测试。几乎所有的代码库中的PHP文件,使用一些$ _ SERVER [“”]变量,如

require_once $_SERVER['DOCUMENT_ROOT'] . '/mainApi.php'; 

所以,现在当我有编写和运行PHPUnit的测试情况下,我必须以某种方式设置这些变量。 目前我在用户环境中设置这些变量,然后做

$_SERVER['DOCUMENT_ROOT'] = getenv('DOCUMENT_ROOT'); 
require_once $_SERVER['DOCUMENT_ROOT'] . '/mainApi.php'; 

获得这样的服务器变量工作正常。我通过命令行运行我的测试,如$ phpunit test.php

Ques1:是否可以设置$ _ SERVER变量在运行命令行通过在PHPUnit测试?

我还必须通过Jenkins运行这些单元测试,并且我无法通过ANT /构建文件设置这些服务器变量。

Ques2:是否可以通过Jenkins中的ant构建文件设置这些变量,或者在通过Jenkins执行phpunit测试之前运行任何shell脚本?

我试图通过一个shell脚本

export DOCUMENT_ROOT=/server/path-to-root-dir 

出口服务器变量并调用脚本在build.xml在詹金斯

<export name="setEnv" description="set server var"> 
    <exec executable="sh"> 
     <arg value = "sumit.sh" /> 
    </exec> 
</target> 

,但它不工作。有没有我能为此做的任何设置? 谢谢!

回答

6

我不确定#1,但PHPUnit本身必须支持它。我看不出有什么办法通过命令行来做到这一点。但是,如果您将当前的解决方案放入bootstrap.php中,则无需在每个测试中执行此操作。

对于#2,<exec>允许您使用嵌套的<env>元素设置环境变量。我在詹金斯使用这个。

<exec executable="phpunit" ...> 
    <env key="DOCUMENT_ROOT" value="/var/www/php"/> 
</exec> 

更新:您通常会创建bootstrap.php设置添加源目录包含路径和初始化测试环境,但是你所需要的。该文件不是由PHPUnit提供的 - 与phpunit.xml不同。

我把它放在与phpunit.xml相同的目录下,但这是因为我为每个项目都有一个单独的文件。它通常位于保存测试的目录中。这使您可以从命令行运行phpunit,而不必告诉它如何找到这些配置文件。否则,您必须使用--bootstrap和/或--configuration指向它们。

这是我如何结构的典型项目:

<project-root>/ 
    build.xml 
    src/ 
     MyClass.php 
    test/ 
     MyClassTest.php 
     phpunit.xml 
     bootstrap.php 
+0

我们可以设置'$ _ SERVER [ 'DOCUMENT_ROOT']'直接通过构建文件?你的方法'''完全正常,但我的代码中有很多SERVER变量,所以我必须写所有'$ _SERVER [] = getenv()'在一个PHP文件中,并将不得不在所有的测试类中导入该文件。有没有办法可以减少它? – Sumitk

+0

@Sumitk - 您可以在'bootstrap.php'中执行PHPUnit在运行任何测试之前自动加载的任务。将文件放置在测试根目录下,或使用'--bootstrap'命令行参数将PHPUnit指向它。 –

+0

这个'bootstrap.php'是一个我们与测试文件一起创建的文件,还是与PHPUnit一起提供的?因为我无法在我的系统上看到它。另外,如果我们创建它,我应该在哪里放置它?与所有的测试文件或'phpunit.xml.dist'? – Sumitk

相关问题