设为首页 收藏本站
查看: 1378|回复: 0

[经验分享] openstack单元測试用组件一览

[复制链接]

尚未签到

发表于 2015-4-12 14:23:48 | 显示全部楼层 |阅读模式

  
声明:
  本博客欢迎转发,但请保留原作者信息!
  博客地址:http://blog.iyunv.com/halcyonbaby
  内容系本人学习、研究和总结,如有雷同,实属荣幸!







组件一览


  • hacking

    一组flake8插件,用于静态检查。

    https://pypi.python.org/pypi/hacking
  • coverage

    衡量python代码覆盖率的工具。能够单独执行/API方式或者以nose插件方式执行“nosetests --with-coverage”。

    https://nose.readthedocs.org/en/latest/plugins/cover.html
  • discover

    測试用例发现。(2.7已经包括在unittest中,2.4须要backport) 主要在run_test.sh下使用。

    https://pypi.python.org/pypi/discover/0.4.0
  • feedparser

    使用python进行parse RSS订阅内容主要在version API的測试中使用(versionAPI支持atom格式返回信息)
  • MySQL-python

    mysql接口的python实现
  • psycopg2

    postgresql接口的python实现
  • pylint

    对python进行静态分析、检查的工具
  • python-subunit

    subunit是測试结果的流协议。python-subunit是它的python实现。
  • sphinx

    文档生成工具(基于Restructed格式)
  • oslosphinx

    openstack对sphinx的扩展
  • testrepository

    測试结果的数据库。主要在覆盖率測试时使用。
  • mock

    对所測试的函数的外部依赖函数进行模拟替换。3.3以后已经是python标准库。mock的实现原理也非常easy,一般使用类似mokey patch的方式实现。
  • mox

    基于java的easymock提供的python mock对象框架(基本上已经停止维护)

    Mox的运行流程:

    • Create mock (in record mode)
    • Set up expectations
    • Put mock into replay mode
    • Run test
    • Verify expected interactions with the mock occurredmox与mock功能类似,都是用来做函数或者类的mock。



Mock方法和属性:
>>> # Mock
>>> my_mock = mock.Mock()
>>> my_mock.some_method.return_value = "calculated value"
>>> my_mock.some_attribute = "value"
>>> assertEqual("calculated value", my_mock.some_method())
>>> assertEqual("value", my_mock.some_attribute)
>>> # Mox
>>> my_mock = mox.MockAnything()
>>> my_mock.some_method().AndReturn("calculated value")
'calculated value'
>>> my_mock.some_attribute = "value"
>>> mox.Replay(my_mock)
>>> assertEqual("calculated value", my_mock.some_method())
>>> assertEqual("value", my_mock.some_attribute)
部分mock(对已有对象的某个方法进行mock):
>>> # Mock
>>> SomeObject.some_method = mock.Mock(return_value='value')
>>> assertEqual("value", SomeObject.some_method())
>>> # Mox
>>> my_mock = mox.MockObject(SomeObject)
>>> my_mock.some_method().AndReturn("value")
'value'
>>> mox.Replay(my_mock)
>>> assertEqual("value", my_mock.some_method())
>>> mox.Verify(my_mock)
抛出异常:
>>> # Mock
>>> my_mock = mock.Mock()
>>> my_mock.some_method.side_effect = SomeException("message")
>>> assertRaises(SomeException, my_mock.some_method)
>>> # Mox
>>> my_mock = mox.MockAnything()
>>> my_mock.some_method().AndRaise(SomeException("message"))
>>> mox.Replay(my_mock)
>>> assertRaises(SomeException, my_mock.some_method)
>>> mox.Verify(my_mock)


  • fixtures

    翻译为“夹具”,顾名思义提供了状态重用等的抽象机制。

---------------myfixture.py-----------------------
import testtools
import unittest
import fixtures
class NoddyFixture(fixtures.Fixture):
def setUp(self):
super(NoddyFixture, self).setUp()
self.frobnozzle = 42
self.addCleanup(delattr, self, 'frobnozzle')

class NoddyTest(testtools.TestCase, fixtures.TestWithFixtures):
def test_example(self):
fixture = self.useFixture(NoddyFixture())
self.assertEqual(42, fixture.frobnozzle)
result = unittest.TestResult()
_ = NoddyTest('test_example').run(result)
print (result.wasSuccessful())
-----------------执行结果------------------------
[iyunv@centoo65 data]# python myfixtures.py
True
-----------经常使用fixture-------------------------
>>> import fixtures
>>> a = fixtures.TempDir()
>>> a.setUp()
>>> print a.path
/tmp/tmpWB8EmF
>>> quit()
----------------------------------------------
其它參见PolicyFixture


  • testtools

    对python标准单元測试框架的扩展。为什么使用?

    • 更好的断言 比方支持assertThat扩展
    • 更具体的debug信息 比方支持addDetails的信息
    • 扩展的同一时候保持兼容性
    • python多版本号的兼容性


  • tox

    通用的虚拟环境管理和測试命令行工具。

    配置能够看project下的tox.ini文件。tox.ini能够通过tox-quickstart生成。

    命令运行,如:“tox -e py26", "tox -e pep8"

    运行单元測试的时候,顺便生成单元測试报告,并检查測试覆盖率,并生成覆盖率报告。直接运行tox是不行的,仅仅能进行单元測试,须要给tox添加?扩展參数,例如以下:tox -- --cover-erase -- --with-coverage -- --cover-html

类说明
  顶级文件夹test.py中:

test.TestCase继承于testtools.TestCase。

test.NoDBTestCase继承于test.TestCase。
  test.TestCase中大量使用了fixture对环境进行初始化。(比方DB,Policy等)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-56332-1-1.html 上篇帖子: OpenStack found problem 下篇帖子: openstack grizzly版network网络节点安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表