Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在mysqli库中伪造错误条件_Php_Testing - Fatal编程技术网

Php 在mysqli库中伪造错误条件

Php 在mysqli库中伪造错误条件,php,testing,Php,Testing,我有各种各样的PHP脚本,它们使用mysqli函数套件访问数据库。我编写了这些脚本来处理各种错误情况(例如,mysqli\u stmt\u execute返回false) 是否有一种简单的方法可以伪造这些错误条件,以验证用户收到的输出是否适合这些条件?如果您不在生产环境中,最好的方法是更改PHP中的各种数据库参数 更改数据库密码以查看如何处理连接错误 修改表结构以查看如何处理查询错误 尝试查看查询中特殊字符(例如:ббббббб)的情况 如果您正在寻找自动化测试,最好的方法是(使用PHP) 使

我有各种各样的PHP脚本,它们使用
mysqli
函数套件访问数据库。我编写了这些脚本来处理各种错误情况(例如,
mysqli\u stmt\u execute
返回false)


是否有一种简单的方法可以伪造这些错误条件,以验证用户收到的输出是否适合这些条件?

如果您不在生产环境中,最好的方法是更改PHP中的各种数据库参数

  • 更改数据库密码以查看如何处理连接错误
  • 修改表结构以查看如何处理查询错误
  • 尝试查看查询中特殊字符(例如:ббббббб)的情况

如果您正在寻找自动化测试,最好的方法是(使用PHP)

使用PHPUnit,您可以编写单元测试(特别是断言),它允许您验证用户接收到的输出是否适用于各种不同的条件。

如果您使用的是mysqli类。 例如:

<?php
     $mysqli = new mysqli("localhost", "user", "password", "db");
     $query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
     $stmt = $mysqli->prepare($query);
     if (false === $stmt->execute()) {
         echo "Oops! some_value for same_field in some_table returned false";
     }
<?php
     $mysqli = mysqli_connect("localhost", "user", "password", "db");
     $query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
     $stmt = mysqli_prepare($mysqli, $query);
     if (false === mysqli_stmt_execute($stmt)) {
         echo "Oops! some_value for same_field in some_table returned false";
     }

也许您问错了问题:为什么您的核心业务逻辑依赖于第三方库/API?你听说过所谓的?将您的应用程序按照这些层次(域、业务、基础架构/测试)进行分层,可以让您更轻松地测试那些不会改变的东西:您的业务逻辑

然而,由于PHP是一种动态类型化语言,模拟基本上是免费的。只要您使用的是OO特性,而不是全局函数,那么创建可测试代码所需要的就是在代码中插入一个假的数据库句柄。一个很好的方法是将
$db
参数添加到函数/方法中。像这样的小事:

function updateStuff($rowIds, $newValues, $db) { ... }

然后,在包含
updateStuff
的单元测试中,将模拟对象作为
$db
参数传入。

这些都是有效的测试用例,但它是否回答了问题?这些都是你实际应用的真实条件,没有涉及伪造。@nickl-在我看来这是最接近的方法。更改端口号将伪造连接错误。更改表结构将伪造查询错误。我们的目标是测试“用户收到的输出是否适合这些条件”,这样就足够了。您没有考虑的是,这些测试不是一次性测试,您必须对每个版本执行整个跳跃、跳跃和跳跃。通过mock,您可以在每次提交后进行检查。你们不可能涵盖每一个场景,拔掉电缆和放下桌子,用模拟游戏,我们不可能错过任何东西@尼克-我从来没有想过这样的解决方案。这是一个很好的方法
<?php
     $mysqli = mysqli_connect("localhost", "user", "password", "db");
     $query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
     $stmt = mysqli_prepare($mysqli, $query);
     if (false === mysqli_stmt_execute($stmt)) {
         echo "Oops! some_value for same_field in some_table returned false";
     }
<?php
    namespace my_faking_namespace {
        function mysqli_stmt_execute($stmt) 
        {
            return false;    
        }

        $mysqli = mysqli_connect("localhost", "user", "password", "db");
        $query = "INSERT INTO some_table (some_field) VALUES ('some_vale')";
        $stmt = mysqli_prepare($mysqli, $query);
        if (false === mysqli_stmt_execute($stmt)) {
            echo "Oops! some_value for same_field in some_table returned false";
        }
    }
function updateStuff($rowIds, $newValues, $db) { ... }