使用mongodb进行集成测试

时间:2016-11-17 00:26:29

标签: mongodb phpunit bdd behat

我使用mongodb作为我的主数据库,所以在我的集成测试中,我尝试测试我的系统是否按预期处理数据。过程如下:

  1. 在需要的集合中插入数据以准备方案
  2. 执行对系统的调用
  3. 验证数据更改或存在于数据库中,具体取决于方案
  4. 我使用behat作为我的BDD测试工具,并在我的FeatureContext上实现插入和读取集合中的数据,如下所示:

    鉴于我有关于集合品牌的以下数据

    [
        {
            "_id": "575df0b00419c905492d0461",
            "name": "Adidas",
            "image": "adidas.png"
        }
    ]
    

    然后我验证集合品牌

    上存在以下数据
    [
        {
            "_id": "575df0b00419c905492d0461",
            "name": "Adidas",
            "image": "adidas.png"
        }
    ]
    

    修改

    /**
     * @Given I have the following data on collection :collectionName
     * @param string $collectionName
     * @param PyStringNode $collectionData
     * @throws Exception
     */
    public function iHaveTheFollowingDataOnCollection($collectionName, PyStringNode $collectionData)
    {
        $data = json_decode($collectionData->getRaw(), true);
    
        foreach ($data as $index => $element) {
            foreach ($element as $key => $value) {
                if ($key === '_id') {
                    $data[$index][$key] = new \MongoDB\BSON\ObjectID($value);
                }
    
                if (strpos($key, "@") !== false) {
                    $key = explode("@", $key)[1];
                    $data[$index][$key] = array(
                        "\$ref" => $value["\$ref"],
                        "\$id" => new \MongoDB\BSON\ObjectID($value["\$id"]),
                        "\$db" => $value["\$db"],
                    );
                }
    
                if ($value === "UNIX_TIME()") {
                    $data[$index][$key] = time();
                }
            }
        }
    
        $collection = $this->db->$collectionName;
    
        foreach ($data as $document) {
            $collection->insertOne($document);
        }
    }
    

    END EDIT

    问题是我在不同的功能上至少有1k种不同的场景,并且由于在收集时没有找到预期的数据,因此大量使用测试会随机失败。

    我首先想到的是数据的插入和可用性存在一些延迟。

    有什么想法以及如何解决它?

0 个答案:

没有答案