Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Sorting 测试数组是随机排序的_Sorting_Phpunit_Shuffle - Fatal编程技术网

Sorting 测试数组是随机排序的

Sorting 测试数组是随机排序的,sorting,phpunit,shuffle,Sorting,Phpunit,Shuffle,我正在测试我的代码。我的代码有几种排序方法:按姓名、年龄、计数和随机排序。下面是按计数排序的实现和测试。这些都很琐碎 class Cloud { //... public function sort($by_property) { usort($this->tags, array($this, "cb_sort_by_{$by_property}")); return $this; } private function cb_sort_by_name($a

我正在测试我的代码。我的代码有几种排序方法:按姓名、年龄、计数和随机排序。下面是按计数排序的实现和测试。这些都很琐碎

class Cloud {
  //...
  public function sort($by_property) {
    usort($this->tags, array($this, "cb_sort_by_{$by_property}"));
    return $this;
  }

  private function cb_sort_by_name($a, $b) {
    $al = strtolower($a->get_name());
    $bl = strtolower($b->get_name());
    if ($al == $bl) {
      return 0;
    }
    return ($al > $bl) ? +1 : -1;
  }

  /**
   * Sort Callback. High to low
   */
  private function cb_sort_by_count($a, $b) {
    $ac = $a->get_count();
    $bc = $b->get_count();
    if ($ac == $bc) {
      return 0;
    }
    return ($ac < $bc) ? +1 : -1;
  }
}
但现在,我想加上“随机排序”

实现可以是从调用
shuffle($this->tags)
到随机返回0、-1或+1的
usort
回调。性能是一个问题,但可测试性更为重要


如何测试数组是否随机排序?另外,很难存根像
shuffle
这样的全局方法

从任何有意义的意义上讲,这实际上是不可能的。如果列表中只有几个项目,则完全有可能按随机排序看起来确实像是按任何给定字段排序(如果元素不太多,它与按任何其他字段排序的顺序相同的几率非常高)


如果你问我排序操作实际上没有以任何方式操作数据,那么单元测试排序操作似乎有点愚蠢。感觉就像是为了它而进行单元测试,而不是因为它实际上是在测量某些东西是否按预期工作。

从任何有意义的意义上来说,这实际上是不可能的。如果列表中只有几个项目,则完全有可能按随机排序看起来确实像是按任何给定字段排序(如果元素不太多,它与按任何其他字段排序的顺序相同的几率非常高)


如果你问我排序操作实际上没有以任何方式操作数据,那么单元测试排序操作似乎有点愚蠢。感觉就像是为了它而进行单元测试,而不是因为它实际上是在测量某些东西是否按预期工作。

我决定用一个全局包装器来实现这一点:

class GlobalWrapper {
  public function shuffle(&$array);
    shuffle($array);
  }
}
在排序中,我通过包装器调用
shuffle

public function sort($by_property) {
  if ($by_property == "random") {
    $this->global_wrapper()->shuffle($this->tags);
  }
  //...
}
然后,在测试中,我可以模拟
GlobalWrapper
,并为感兴趣的全局函数提供存根。在本例中,我感兴趣的是调用该方法,而不是它输出的内容[1]

 public function testSortRandomUsesShuffle() {
   $global = $this->getMock("GlobalWrapper", array("shuffle"));
   $drupal->expects($this->once())
     ->method("shuffle");
   $this->object->set_global_wrapper($drupal);

   $this->object->sort("random");
 }

[1] 实际上,我也对这个包装进行了单元测试,测试参数和它执行引用调用的事实。此外,这个包装已经实现(并被称为
DrupalWrapper
),以允许我存根由第三方(Drupal)提供的某些全局函数。这个实现允许我使用
set\u drupal()
传入包装器,并使用
drupal()
获取它。在上面的示例中,我调用了这些
set\u global\u wrapper()
global\u wrapper()

我决定用一个全局包装器来实现这一点:

class GlobalWrapper {
  public function shuffle(&$array);
    shuffle($array);
  }
}
在排序中,我通过包装器调用
shuffle

public function sort($by_property) {
  if ($by_property == "random") {
    $this->global_wrapper()->shuffle($this->tags);
  }
  //...
}
然后,在测试中,我可以模拟
GlobalWrapper
,并为感兴趣的全局函数提供存根。在本例中,我感兴趣的是调用该方法,而不是它输出的内容[1]

 public function testSortRandomUsesShuffle() {
   $global = $this->getMock("GlobalWrapper", array("shuffle"));
   $drupal->expects($this->once())
     ->method("shuffle");
   $this->object->set_global_wrapper($drupal);

   $this->object->sort("random");
 }
[1] 实际上,我也对这个包装进行了单元测试,测试参数和它执行引用调用的事实。此外,这个包装已经实现(并被称为
DrupalWrapper
),以允许我存根由第三方(Drupal)提供的某些全局函数。这个实现允许我使用
set\u drupal()
传入包装器,并使用
drupal()
获取它。在上面的示例中,我调用了这些
set\u global\u wrapper()
global\u wrapper()

假设您正在使用您的方法,它们应该是这样的

sortRandom(){
返回洗牌($this->tags);
}
好的,您不需要测试键是否被洗牌,但数组是否仍然返回

函数testSortRandom(){
$this->assertTrue(是数组($this->object->sortRandom());
}
您应该测试您的代码,而不是php核心代码。

假设您正在使用您的方法,应该如下所示

sortRandom(){
返回洗牌($this->tags);
}
好的,您不需要测试键是否被洗牌,但数组是否仍然返回

函数testSortRandom(){
$this->assertTrue(是数组($this->object->sortRandom());
}

你应该测试你的代码,而不是php核心代码。

单元测试排序操作有三个原因:100%的覆盖率(本身不是目标,但仍然很重要),排序不是微不足道的(尝试排序
ÄÖABO
正确),因为BDD需要我使用测试(写测试,然后实现)来驱动代码对排序操作进行单元测试有三个原因:100%的覆盖率(本身不是一个目标,但仍然很重要),排序不是微不足道的(尝试对
ÄÄÖABO
进行正确排序),并且因为BDD要求我使用测试(编写测试,然后实现)来驱动代码。«应该测试代码,而不是php核心代码。»正确。这就是为什么我更喜欢测试调用某个方法的方式(
shuffle()
)。我对这种方法是否如预期的那样有效不感兴趣;我应该相信PHP核心已经测试过了。«您应该测试您的代码,而不是PHP核心代码。»正确。这就是为什么我更喜欢测试调用某个方法的方式(
shuffle()
)。我对这种方法是否如预期的那样有效不感兴趣;我应该能够相信PHP核心已经测试过了。