编程语言
首页 > 编程语言> > 涵盖功能的许多测试用例-phpunit

涵盖功能的许多测试用例-phpunit

作者:互联网

对于以下功能,我需要编写更多的测试用例,我已经编写了一个,可以有人给出一些想法,也许可以测试中间函数调用的返回值.

 public function calculateShortestPath($graphObj, $start, $destination)
{
    $shortestPath = null;

    if ($this->validateParams($graphObj, $start, $destination) == true) {

        $result = $this->getAllVerticesAndNeighbours($graphObj);

        $vertices = $result[self::VERTICES];
        $neighbours = $result[self::NEIGHBOURS];

        $vertexCost = array_fill_keys($vertices, self::INFINITY);
        $visitedVertices = array_fill_keys($vertices, null);

        $vertexCost[$start] = 0;
        $vertexQueue = $vertices;

        $result = $this->getShortestPath($vertexQueue, $vertexCost, $neighbours, $visitedVertices, $destination);

        $vertexCost = $result[self::VERTEX_COST];
        $shortestPathVertices = $result[self::SHORTEST_PATH_VERTICES];

        $path = $this->getRefinedShortestPath($shortestPathVertices, $destination);

        $shortestPath = new ShortestPath($path, $vertexCost[$destination]);

    }

    return $shortestPath;
}

我已经写了以下案例

 /**
 * Test for calculateShortestPath function
 *
 * @param string|int $start starting point
 * @param string|int $destination destination point
 * @param array $expectedShortestPath expected shortest path
 * @param int|float $expectedCost expected cost
 * @dataProvider testCalculateShortestPathDataProvider
 */
public function testCalculateShortestPath($start, $destination, $expectedShortestPath, $expectedCost)
{
    $actualResult = $this->shortestPathCalc->calculateShortestPath($this->graph, $start, $destination);

    /* @var $actualResult ShortestPath */
    $this->assertEquals(
        $expectedShortestPath,
        $actualResult->getPath(),
        sprintf('Incorrect shortest path from %d to %d !', $start, $destination)
    );

    $this->assertEquals(
        $expectedCost,
        $actualResult->getCost(),
        sprintf('Incorrect shortest path cost from %d to %d !', $start, $destination)
    );
}

解决方法:

通常,单元测试应表现出两个特征:

>每个测试只能测试一件事
>每个测试都应该尽可能地愚蠢

第一个特征的原因是,如果测试失败,它将记录哪个测试案例方法触发了失败.如果该方法测试了很多东西,那么确定确切的故障就更麻烦了.

之所以存在第二个特征,是因为每次测试失败都会出现问题.该问题只能存在于以下两个位置之一(忽略PHP及其扩展程序或单元测试程序中的错误):被测试的代码或测试本身. “聪明”的测试将很难确定是哪种情况,并且您不想花一两个小时寻找类中的错误,而事实证明这实际上是测试的错误.

在上面的示例中,您当前的测试相当不错,但是它违反了第一个规则(一次有两个测试在进行).除非运行所测试的方法确实非常昂贵,否则值得将这个测试用例进行两次,第一次运行声明期望的最短路径,第二次运行声明期望的成本(如果您的方法确实有昂贵的运行时间,则有一个鼓励尝试在那里进行优化:)).

您的测试也可能违反第二条规则,因为我不知道$this->是什么.图形是或如何设置的.这是实际的业务对象还是仅仅是其模型?您可能想要研究PHPUnit的模拟存根功能.

关于测试策略,有两种通用方法:黑盒测试(在其中您根据设备的规格测试设备,但对它的内部工作情况一无所知)和玻璃盒(在其中使用对设备的内部工作的知识来进行测试).设计测试).我的首选方法是主要采用黑盒策略,围绕规格构建测试,然后在完全了解规格后,转到玻璃盒策略以编写其他测试,该测试将覆盖黑盒测试的所有代码路径不运动.

测试通常是关于边界的,就像在输入有效和无效时测试对输入的响应一样.因此,对于您的类具有的每种方法,您都需要一种典型的情况(通常称为“快乐之路”)来说明典型的用法,一些极端但仍然有效的输入,一系列超出有效范围的输入(如果您的方法会排除1-10之间的数字,然后用0的测试用例和用11的测试用例来覆盖那些用例)和用数据超出有效范围的测试用例.在有效输入和无效输入之间的转换时会发生很多编程错误(最著名的例子就是“一一错误”),因此您的测试应彻底覆盖这些区域.

黑盒测试的一个好处是,如果您了解规范,则可以在没有任何代码可以测试之前就编写测试.然后,您可以开始实施代码,对其进行测试,针对失败的测试进行更正,然后重复此过程,直到获得100%的通过率.这称为测试驱动开发.

标签:unit-testing,symfony,phpunit,php
来源: https://codeday.me/bug/20191120/2045568.html