使用 pytest 的 Python 单元测试覆盖率

如何解决使用 pytest 的 Python 单元测试覆盖率

我是 pytest 的新手,我想添加以下 3 种方法来进行单元测试覆盖,而不实际使用真正的 mongo db 实例,而是模拟它。 可以尝试使用真正的数据库实例,但不推荐。 请求一个关于如何模拟 mongodb 客户端并获取文档的示例

import os
import logging
import urllib.parse
from dotenv import load_dotenv
from pymongo import MongoClient
from logger import *

load_dotenv()


def getMongoConnection():
    userName = urllib.parse.quote_plus(os.getenv("USER_NAME"))
    password = urllib.parse.quote_plus(os.getenv("PASSWORD"))
    hostName1_port = os.getenv("HOST_NAME1")
    hostName2_port = os.getenv("HOST_NAME2")
    hostName3_port = os.getenv("HOST_NAME3")
    authSourceDatabase = os.getenv("AUTH_SOURCE_DATABASE")
    replicaset = os.getenv("REPLICA_SET")
    connectTimeoutMS = "1000"
    socketTimeoutMS = "30000"
    maxPoolSize = "100"

    try:
        client = MongoClient('mongodb://'+userName+':'+password+'@'+hostName1_port+','+hostName2_port+','+hostName3_port+'/'+authSourceDatabase+'?ssl=true&replicaset='+replicaset +
                             '&authSource='+authSourceDatabase+'&retryWrites=true&w=majority&connectTimeoutMS='+connectTimeoutMS+'&socketTimeoutMS='+socketTimeoutMS+'&maxPoolSize='+maxPoolSize)
        return client
    except Exception as e:
        logging.error("Error while connecting to mongoDB.")
        return False


def connectToDBCollection(client,databaseName,collectionName):
    db = client[databaseName]
    collection = db[collectionName]
    return collection


def getDoc(bucketName,collectionName):
    try:
        client = getMongoConnection()
        if client != False:
            collection = connectToDBCollection(
                client,collectionName)
            return collection.find_one({'bucket': bucketName})
    except Exception as e:
        logging.error("An exception occurred while fetching doc,error is ",e)

编辑:(尝试使用下面的代码并能够覆盖大多数情况但看到错误

def test_mongo():
    db_conn = mongomock.MongoClient()
    assert isinstance(getMongoConnection(),MongoClient)


def test_connect_mongo():
    return connectToDBCollection(mongomock.MongoClient(),"sampleDB","sampleCollection")


//trying to cover exception block for getMongoConnection()
def test_exception():
    with pytest.raises(Exception) as excinfo:
        getMongoConnection()
    assert str(excinfo.value) == False


def test_getDoc():
    collection = mongomock.MongoClient().db.collection
    stored_obj = collection.find_one({'_id': 1})
    assert stored_obj == getDoc("bucket","db","collection")


def test_createDoc():
    collection = mongomock.MongoClient().db.collection
    stored_obj = collection.insert_one({'_id': 1})
    assert stored_obj == createDoc("bucket","collection")


def test_updateDoc():
    collection = mongomock.MongoClient().db.collection
    stored_obj = collection.replace_one({'_id': 1},{'_id': 2})
    assert stored_obj == updateDoc(
        {'_id': 1},{'$set': {'_id': 2}},"collection")

错误: test_exception - 失败:DID NOT RAISE test_createDoc - 类型错误:并非所有参数都在字符串格式化期间转换 断言错误:断言 ==

解决方法

看起来 MongoClient 是一个带有 databaseNamecollectionName 的嵌套字典,或者是使用键访问器实现的。

你可以先用

模拟客户端
import unittest
mocked_collection = unittest.mock.MagicMock()
# mock the find_one method
mocked_collection.find_one.return_value = {'data': 'collection_find_one_result'}
mocked_client = unittest.mock.patch('pymongo.MongoClient').start()
mocked_client.return_value = {
    'databaseName': {'collectionname': mocked_collection}
}
,

也许可以试试像 MongoMock 这样的专门的模拟库?

特别是最后一个使用 NAME FORMULA. CHARGE MNX_ID CHEBI_ID HMDB_ID 0 (+)-alpha-pinene C10H16 0 MNXM163755 36740.0 HMDB0652 的示例看起来可能与您的代码相关。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?