您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python单元测试MongoDB随机失败

5b51 2022/1/14 8:21:13 python 字数 4990 阅读 488 来源 www.jb51.cc/python

Python的unittest和PyMongo有一个奇怪的问题.测试随机成功或失败:import unittest from pymongo import Connection from tractor import Tractor class TestTractor(unittest.TestCase): def setUp(self):

概述

Python的unittest和PyMongo有一个奇怪的问题.测试随机成功或失败:

import unittest
from pymongo import Connection

from tractor import Tractor




class TestTractor(unittest.TestCase):
    def setUp(self):
        self.tractor = Tractor(1)

        self.mongo = Connection()
        self.db = self.mongo.tractor

        self.db.classes.remove({'name': {'$regex':'^test_'}})

        self.action_class_id = self.db.classes.insert({'name': 'test_action','Metaclass': 'action'})
        self.object_class_id = self.db.classes.insert({'name': 'test_object','Metaclass': 'object'})


    def tearDown(self):
        self.tractor = None



    def test_create_class(self):
        cid1 = self.tractor.create_action_class('test_create_action_class')
        cid2 = self.tractor.create_object_class('test_create_object_class')

        self.assertNotEqual(cid1,None)
        self.assertNotEqual(cid2,None)

        action_obj = self.db.classes.find_one({'_id': cid1})
        object_obj = self.db.classes.find_one({'_id': cid2})

        self.assertNotEqual(cid1,cid2)
        self.assertEqual(action_obj['_id'],cid1)
        self.assertEqual(object_obj['_id'],cid2)

        self.assertEqual(action_obj['name'],'test_create_action_class')
        self.assertEqual(object_obj['name'],'test_create_object_class')

正在测试的类:

from pymongo import Connection
from pymongo.objectid import ObjectId



class Tractor(object):
    def __init__(self,uid):
        self.uid = uid
        self.mongo = Connection()
        self.db = self.mongo.tractor


    # Classes

    def create_action_class(self,name):
        return self.db.classes.insert({'name': name,'attributes': [],'Metaclass': 'action'})

    def create_object_class(self,'Metaclass': 'object'})

随机行为:

silver@aregh-6930-lnx ~/projects/traction/tractor $python -m unittest discover
......ssEssssssssss
======================================================================
ERROR: test_create_class (tests.test_tractor.TestTractor)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/silver/projects/traction/tractor/tests/test_tractor.py",line 64,in test_create_class
    self.assertEqual(action_obj['_id'],cid1)
TypeError: 'nonetype' object is not subscriptable

----------------------------------------------------------------------
Ran 19 tests in 0.023s

Failed (errors=1,skipped=12)

silver@aregh-6930-lnx ~/projects/traction/tractor $python -m unittest discover
......ss.ssssssssss
----------------------------------------------------------------------
Ran 19 tests in 0.015s

OK (skipped=12)

这两个结果随机发生在同一测试中,因为我重新运行测试而不改变类中和测试中的任何内容.

所有这些都在我的机器上运行,我确信在运行测试时,没有其他任何东西都没有使用MongoDB和代码.

是什么赋予了?

认情况下,MongoDB使用“fire and forget”模式.这意味着insert命令被发送到服务器,但驱动程序不检查任何服务器响应.

当您切换到“安全”模式时,驱动程序将发送insert命令,然后它将发送第二个命令getLastError.当服务器实际提交写入时,将返回第二个命令.

同样,认情况下,您运行的是“即发即弃”模式,因此这里确实存在潜在的竞争条件.对于单元测试,您需要在“安全”模式下运行.

插入的函数签名定义为here.但是,您还应该能够在连接级别进行更改,以便每个与DB的连接在认情况下都使用“安全”模式.

总结

以上是编程之家为你收集整理的Python单元测试MongoDB随机失败全部内容,希望文章能够帮你解决Python单元测试MongoDB随机失败所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶