【问题标题】:PHP MySQL Function Unit TestingPHP MySQL 函数单元测试
【发布时间】:2011-08-01 21:51:51
【问题描述】:

我需要测试我使用 PHP 5 创建的一些函数,这些函数执行我的 Web 应用程序所需的数据库 CRUD 类型操作(SELECT、UPDATE、INSERT、DELETE)。

我一直在研究 PHP 单元测试套件,例如 Simple Test 和 PHP Unit,它们似乎提供了我需要的东西,但是我不确定我打算如何实现这一点,因为等价分区和边界分析并不是那么清楚.我只需要输入不同的变量并改变它吗?这似乎毫无意义,因为不同的字符串不一定会产生任何影响。

任何有关这方面的指导都会有所帮助,因为我以前没有遇到过。

【问题讨论】:

    标签: php mysql unit-testing phpunit simpletest


    【解决方案1】:

    通常,单元测试的想法是确保,如果您进行更改,您可以简单地运行一系列简单的测试,以确保不会破坏现有功能。也就是说,您需要涵盖您期望的典型数据,以及边缘/边界情况,其中可能包括带引号的字符串(以验证它们是否被正确转义)、SQL 注入攻击(相同) 、空字符串、不同编码的字符串、NULL、布尔值true 等。每个测试都应该验证,给定您输入的数据,您会得到预期的结果,在这种情况下(分别):插入转义字符串,插入转义字符串、插入空字符串、转换或抛出不同的编码然后插入、在 NULL 值上抛出错误、插入字符串 'true' 等。

    我已经有好几年没用过这两个测试框架了,但我记得用 PHPUnit 取得了不错的结果。

    【讨论】:

      【解决方案2】:

      如果您正在测试 PHP 代码和 MySQL 数据库之间的交互,那么您正在执行集成测试,而不是单元测试。

      以下是使用Enhance PHP framework 进行集成测试的一些示例,它测试保存和检索租户对象的存储库类。

      它不是针对预先填充的数据库运行,而是在完全空的数据库上运行,并使用简单的表助手创建和销毁表。这消除了对特定数据在测试数据库中处于正确状态的依赖,这很难保持同步。

      <?php
      class TenantRepositoryTestFixture extends EnhanceTestFixture {
          private $Target;
      
          public function SetUp() {
              $tables = new TableHelper();
              $tables->CreateTenantTable();
              $this->Target = Enhance::GetCodeCoverageWrapper('TenantRepository');
          }
      
          public function TearDown() {
              $tables = new TableHelper();
              $tables->DropTenantTable();
          }
      
          public function SaveWithNewTenantExpectSavedTest() {
              $tenant = new Tenant();
              $tenant->Name = 'test';
      
              $saved = $this->Target->Save($tenant);
              $result = $this->Target->GetById($saved->Id);
      
              Assert::AreNotIdentical(0, $result->Id);
              Assert::AreIdentical($tenant->Name, $result->Name);
          }
      
          public function SaveWithExistingTenantExpectSavedTest() {
              $tenant = new Tenant();
              $tenant->Name = 'test';
              $saved = $this->Target->Save($tenant);
              $saved->Name = 'changed';
              $saved = $this->Target->Save($saved);
      
              $result = $this->Target->GetById($saved->Id);
      
              Assert::AreIdentical($saved->Id, $result->Id);
              Assert::AreIdentical($saved->Name, $result->Name);
          }
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 2013-05-22
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2022-01-01
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多