PHP,比较打印输出的MD5是否可以用于测试结果?
我正在使用CodeIgniter并试图为模型返回的数据编写测试;CI的测试库在检查内容方面非常有限,因此我一直在这样做:PHP,比较打印输出的MD5是否可以用于测试结果?,php,unit-testing,Php,Unit Testing,我正在使用CodeIgniter并试图为模型返回的数据编写测试;CI的测试库在检查内容方面非常有限,因此我一直在这样做: $test = "My Test Name"; $expected = md5(print_r(array(array('val','other'), array('new','old','blue')), 1)); $result = md5(print_r($this->model->method($data), 1)); if($expecte
$test = "My Test Name";
$expected = md5(print_r(array(array('val','other'), array('new','old','blue')), 1));
$result = md5(print_r($this->model->method($data), 1));
if($expected == $result) {
echo "$test [pass]";
}
else {
echo "$test [fail]";
}
这样测试有什么陷阱吗?是否有一个我没有找到的首选、简单的CI库?内置测试库不允许您使用这种细粒度来检查结果,因此我觉得它没有太大的帮助。是的,这应该很好,因为如果两者都相同,哈希值也应该相同
但是,为什么不直接检查
print\r
的输出呢?或者,就这一点而言,使用一个完全独立的工具,如用于测试?假设要比较的两个变量都是数组,请查看内置的数组_diff()
函数()。如果还需要比较数组的索引,请使用array\u diff\u assoc()
但是,如果您希望对测试多维数组(就像您的一样)进行完整检查,那么下面的函数可以帮助您完成这项工作:
function compare_arrays($first_array, $second_array, $compare_keys = false){
/* Test if arrays are actually arrays */
if(!is_array($first_array)){
// Elements are not arrays
if(is_array($second_array)){
// Second array is not array
return false;
}
if($first_array == $second_array){
return true;
}
} elseif(!is_array($second_array)){
// Second array is not array (first is)
return false;
}
/* Test same number of elements */
if(count($first_array) != count($second_array)){
return false;
}
$size = count($first_array);
if($compare_keys){
// Load keys to compare
$first_keys = array_keys($first_array);
$second_keys = array_keys($second_array);
}
for($i = 0; $i < $size; $i++){
if($compare_keys && $first_keys[$i] != $second_keys[$i]){
// Keys do not match
return false;
}
if(is_array($first_array[$i])){
// Element is array
if(!is_array($second_array[$i])){
// Matching element in other array is not array
return false;
}
$result = compare_arrays($first_array[$i], $second_array[$i], $compare_keys);
if(!$result){
// Sub-arrays do not match
return false;
}
// Match - skip iteration
continue;
} elseif(is_array($second_array[$i])){
// Second array element is array (first is not)
return false;
}
// Elements are not arrays
if($first_array[$i] != $second_array[$i]){
return false;
}
}
// Match
return true;
}
函数比较数组($first\u array,$second\u array,$compare\u keys=false){
/*测试数组是否实际上是数组*/
如果(!is_数组($first_数组)){
//元素不是数组
if(is_数组($second_数组)){
//第二个数组不是数组
返回false;
}
if($first\u array==$second\u array){
返回true;
}
}elseif(!is_数组($second_数组)){
//第二个数组不是数组(第一个是)
返回false;
}
/*测试相同数量的元素*/
if(计数($first_数组)!=count($second_数组)){
返回false;
}
$size=计数($first\u数组);
如果($compare_key){
//加载要比较的关键点
$first_keys=数组_keys($first_数组);
$second\u keys=数组\u keys($second\u array);
}
对于($i=0;$i<$size;$i++){
如果($compare_keys&&$first_keys[$i]!=$second_keys[$i]){
//钥匙不匹配
返回false;
}
if(is_数组($first_数组[$i])){
//元素是数组
如果(!is_数组($second_数组[$i])){
//其他数组中的匹配元素不是数组
返回false;
}
$result=compare_数组($first_数组[$i],$second_数组[$i],$compare_键);
如果(!$result){
//子数组不匹配
返回false;
}
//匹配-跳过迭代
继续;
}elseif(is_数组($second_数组[$i])){
//第二个数组元素是数组(第一个不是)
返回false;
}
//元素不是数组
if($first_数组[$i]!=$second_数组[$i]){
返回false;
}
}
//匹配
返回true;
}
用法:
$br = '<br />';
$array_one = array(4, 5, array(2, 5), 'hello', 'element');
if(compare_arrays($array_one, $array_one)){
echo 'Match 1'.$br;
} else {
echo 'No Match 1'.$br;
}
$array_two = array(5, 5, array(2, 5), 'hello', 'element'); // Slightly different
if(compare_arrays($array_one, $array_two)){
echo 'Match 2'.$br;
} else {
echo 'No Match 2'.$br;
}
/* Output:
Match 1
No Match 2
*/
$br='
';
$array_one=array(4,5,array(2,5),'hello','element');
if(比较数组($array\u one,$array\u one)){
回显“匹配1”。$br;
}否则{
回显“不匹配1”。$br;
}
$array_two=数组(5,5,数组(2,5),'hello','element');//略有不同
if(比较数组($array\u one,$array\u two)){
回声“匹配2”。$br;
}否则{
回显“不匹配2”。$br;
}
/*输出:
比赛1
没有对手2
*/
不需要散列。不确定如何将PHPUnit与Codeigniter结合使用。老实说,我一开始对编写测试是完全陌生的,但我正在开发一个足够大的代码库,这似乎相当重要。这不是测试的问题,而是简单性的问题。他建议你直接比较这些值,而不是取每个值的MD5和。直接比较消除了计算校验和的开销,并消除了冲突的可能性。。。。如果要检查两个数组是否相等,则出错。。。检查它们是否相等。
if($array1 === $array2) {
# the arrays are matched with identical keys and values
# no matter how deeply nested
}