如何解决使用 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
解决方法
看起来 MongoClient 是一个带有 databaseName
和 collectionName
的嵌套字典,或者是使用键访问器实现的。
你可以先用
模拟客户端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 举报,一经查实,本站将立刻删除。