Python的unittest和PyMongo有一个奇怪的问题.测试随机成功或失败:
import unittestfrom pymongo import Connectionfrom tractor import Tractorclass 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 Connectionfrom pymongo.objectID import ObjectIDclass 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.023sFailed (errors=1,skipped=12)
…
silver@aregh-6930-lnx ~/projects/traction/tractor $python -m unittest discover......ss.ssssssssss----------------------------------------------------------------------Ran 19 tests in 0.015sOK (skipped=12)
这两个结果随机发生在同一测试中,因为我重新运行测试而不改变类中和测试中的任何内容.
所有这些都在我的机器上运行,我确信在运行测试时,没有其他任何东西都没有使用MongoDB和代码.
是什么赋予了?
最佳答案我强烈怀疑这里的问题是你没有使用“安全”模式进行写入.默认情况下,MongoDB使用“fire and forget”模式.这意味着insert命令被发送到服务器,但驱动程序不检查任何服务器响应.
当您切换到“安全”模式时,驱动程序将发送insert命令,然后它将发送第二个命令getLastError.当服务器实际提交写入时,将返回第二个命令.
同样,默认情况下,您运行的是“即发即弃”模式,因此这里确实存在潜在的竞争条件.对于单元测试,您需要在“安全”模式下运行.
插入的函数签名定义为here.但是,您还应该能够在连接级别进行更改,以便每个与DB的连接在默认情况下都使用“安全”模式. 总结
以上是内存溢出为你收集整理的Python单元测试MongoDB随机失败全部内容,希望文章能够帮你解决Python单元测试MongoDB随机失败所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)