【问题标题】:How to set specific class properties for a PHPunit test?如何为 PHPunit 测试设置特定的类属性?
【发布时间】:2011-03-29 14:27:06
【问题描述】:

phpunit 在测试中设置一些默认配置值的最佳实践是什么?

我正在考虑像这样的价值观

  • 用户名
  • 客户 ID 号。
  • 等等..

    通常我会使用构造函数或一些设置器来设置它,但是当我只有这样的类时我不确定如何执行此操作

    class RestTest extends PHPUnit_Framework_TestCase {
    

    例如,我正在尝试为 REST 和 SOAP 服务制作测试用例。

    我需要指定 url/user 并通过,但它们在 dev/test/production 上发生了变化,所以我需要一种干净的方式来指定它们。

  • 【问题讨论】:

    • 由于两个答案都不能满足您的要求,您能否更深入地了解您的需求?一个具体的例子可能会有所帮助。

    标签: php unit-testing phpunit


    【解决方案1】:

    如果您在测试的每个测试用例中都有一些默认值(例如 UserId),我建议您在类的 setUp 方法中设置这些值。

    只是一个设置值的例子:

    class MtTest extends PHPUnit_Framework_TestCase {
    
        // As a property
        private $testUser = 7;
    
        // In the setUp
        public function setUp() {
            $this->testUser = 7;
            $this->defaultName = "BOB";
            $this->MtClass = new Mt();
        }
    
        public function testFoo() {
             $this->assertTrue($this->MtClass->userExists($this->testUser));
        }
    }
    

    如果您有一组值需要输入到一个测试方法中,请使用建议的 @SilverLight (+1) 等 DataProviders。

    对评论的回应:

    如果您需要某种环境设置(无论您尝试做什么,我现在只使用用户名,因为我猜不出来)您可以将它们设置在您的 PHPUnit Bootstrap(或您的文件中)传递给--bootstrap):

    bootstrap.php

    <?php
    define("PHPUnit_Username", "Fuuu");
    // or
    $phpunitConfig = new Array(
         "username" => "fuu",
    )
    // or whatever suits you there. No reason for me to type a config object i guess
    class MyPHPUnitConfig {
         public function getUsername() { return "wtf"; }
    }
    

    也许有你自己的基础测试类

    <?php
    class MyBaseTest extends PHPUnit_Framework_TestCase {
    
        public function setUp() {
            parent::setUp();
            $this->config = new MyPHPUnitConfig();
        }
    }
    

    并由此延伸。或者使用setUpBeforeClass 每个测试类只做一次。


    如果那不能回答你的问题,我只是不明白你在说什么。这是一个测试用例,它没有任何强依赖关系,它kinda shouldn't have any (Isolation) 我不猜你的问题是如何将一个值放入你的 setUp 函数中是吗? (因为那不是 phpunit 的问题)。

    如果有帮助请告诉我

    【讨论】:

    • 这是硬编码的,我需要一个灵活的配置。你会在普通的课堂上做这种代码吗?
    • 不,因为它是单元测试。已知值输入,预期值输出。我没想到您需要某种环境设置,而只是将它们拉到您的 setUp 类或 PHPUnit 引导程序中。我会稍微编辑一下
    • 我认为这是正确的方法。为了清楚起见,我添加了一个小例子。
    • 如果您有一组额外的凭据only 用于测试,我会创建一个类似“MySoapBaseTest”的 baseTestClass 并将它们放在那里。如果需要,这还允许您模拟服务。它不是一个配置文件,但我猜它是维护它们的好地方。如果每个开发人员都需要这个我会说:将它们放入项目的(开发)应用程序配置中,然后将它们从 BaseClass 中拉出 :)
    【解决方案2】:

    我想你在找data providers:

    <?php
    class DataTest extends PHPUnit_Framework_TestCase
    {
        /**
         * @dataProvider provider
         */
        public function testAdd($a, $b, $c)
        {
            $this->assertEquals($c, $a + $b);
        }
    
        public function provider()
        {
            return array(
              array(0, 0, 0),
              array(0, 1, 1),
              array(1, 0, 1),
              array(1, 1, 3)
            );
        }
    }
    ?>
    

    数据提供者可以包含任何类型的信息,包括用户名、客户端 ID 等。

    【讨论】:

    • 我需要一个适用于任何功能而非提供者的通用配置。
    猜你喜欢
    • 2016-12-31
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2013-04-30
    • 2012-11-21
    • 2012-12-07
    相关资源
    最近更新 更多