Python单元测试MongoDB随机失败

前端之家收集整理的这篇文章主要介绍了Python单元测试MongoDB随机失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

  1. import unittest
  2. from pymongo import Connection
  3. from tractor import Tractor
  4. class TestTractor(unittest.TestCase):
  5. def setUp(self):
  6. self.tractor = Tractor(1)
  7. self.mongo = Connection()
  8. self.db = self.mongo.tractor
  9. self.db.classes.remove({'name': {'$regex':'^test_'}})
  10. self.action_class_id = self.db.classes.insert({'name': 'test_action','Metaclass': 'action'})
  11. self.object_class_id = self.db.classes.insert({'name': 'test_object','Metaclass': 'object'})
  12. def tearDown(self):
  13. self.tractor = None
  14. def test_create_class(self):
  15. cid1 = self.tractor.create_action_class('test_create_action_class')
  16. cid2 = self.tractor.create_object_class('test_create_object_class')
  17. self.assertNotEqual(cid1,None)
  18. self.assertNotEqual(cid2,None)
  19. action_obj = self.db.classes.find_one({'_id': cid1})
  20. object_obj = self.db.classes.find_one({'_id': cid2})
  21. self.assertNotEqual(cid1,cid2)
  22. self.assertEqual(action_obj['_id'],cid1)
  23. self.assertEqual(object_obj['_id'],cid2)
  24. self.assertEqual(action_obj['name'],'test_create_action_class')
  25. self.assertEqual(object_obj['name'],'test_create_object_class')

正在测试的类:

  1. from pymongo import Connection
  2. from pymongo.objectid import ObjectId
  3. class Tractor(object):
  4. def __init__(self,uid):
  5. self.uid = uid
  6. self.mongo = Connection()
  7. self.db = self.mongo.tractor
  8. # Classes
  9. def create_action_class(self,name):
  10. return self.db.classes.insert({'name': name,'attributes': [],'Metaclass': 'action'})
  11. def create_object_class(self,'Metaclass': 'object'})

随机行为:

  1. silver@aregh-6930-lnx ~/projects/traction/tractor $python -m unittest discover
  2. ......ssEssssssssss
  3. ======================================================================
  4. ERROR: test_create_class (tests.test_tractor.TestTractor)
  5. ----------------------------------------------------------------------
  6. Traceback (most recent call last):
  7. File "/home/silver/projects/traction/tractor/tests/test_tractor.py",line 64,in test_create_class
  8. self.assertEqual(action_obj['_id'],cid1)
  9. TypeError: 'NoneType' object is not subscriptable
  10. ----------------------------------------------------------------------
  11. Ran 19 tests in 0.023s
  12. Failed (errors=1,skipped=12)

  1. silver@aregh-6930-lnx ~/projects/traction/tractor $python -m unittest discover
  2. ......ss.ssssssssss
  3. ----------------------------------------------------------------------
  4. Ran 19 tests in 0.015s
  5. OK (skipped=12)

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

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

是什么赋予了?

最佳答案
我强烈怀疑这里的问题是你没有使用“安全”模式进行写入.

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

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

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

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

猜你在找的Python相关文章