资源描述
单击鼠标编辑标题文的格式,单击鼠标编辑大纲正文格式,第二个大纲级,第三个大纲级,第四个大纲级,第五个大纲级,第六个大纲级,第七个大纲级,单击鼠标编辑标题文的格式,单击鼠标编辑大纲正文格式,第二个大纲级,第三个大纲级,第四个大纲级,第五个大纲级,第六个大纲级,第七个大纲级,#,北京海云捷迅科技有限公司,OpenStack,Testing&Debugging,Nick,03/15/2014,OpenStack,Test,1,OpenStack Tests,测试介绍,测试框架,单元测试,集成测试,单步调试,测试介绍,Small Tests,Medium Tests,Large Tests,测试介绍:,Small Tests,单元测试,特点,针对执行单元:,Function,资源访问,不访问数据库、文件系统和网络,隔离,单元测试用例间互相隔离,互不影响,依赖,单元测试用例间没有依赖关系,测试介绍:,Medium Tests,功能测试,特点,针对功能模块,资源访问,访问数据库、文件系统和网络,测试用例设计,单个测试用例涉及多个功能实现,集成环境,+,单个功能点的测试,测试介绍:,Large Tests,系统集成测试,特点,针对整个子系统模块,资源访问,访问数据库、文件系统和网络,自动化测试功能点,测试介绍,测试框架和相关技术,单元测试框架,nose,模拟测试框架,mock,功能测试环境,devstack,集成测试框架,tempest,Nose,Review,2,单元测试框架,Nose,nose,项目是于,2005,年发布的,也就是,py.test,改名后的一年。它是由,Jason Pellerin,编写的,支持与,py.test,相同的测试习惯做法,但是这个包更容易安装和维护。尽管,py.test,在某些方面有所进步,目前也很容易安装,但是,nose,仍然保持了易用性方面的声誉。,Nose,的安装,pip install nose,Nose,安装,安装完成后,测试一下:,安装成功,编写简单,Nose,用例,defTestfunc():,a=1,b=2,asserta=b,把上面的文件保存到一个目录下(注意:测试文件命令以,Test,或,test,开头),然后在该目录下在命令行里执行,nosetests,简单的测试,Setup,和,tearDown,Setup,和,tearDown,setup:,在测试用例开始时被执行,tearDown,:在测试用例结束后被执行,可支持如下级别:,模块的,setUp,和,tearDown,测试函数的,setUp,和,tearDown,测试类的的,setUp,和,tearDown,package,的,setUp,和,tearDown,模块的,Setup,和,tearDown,测试代码,def setUp():,print test setup,def tearDown():,print test teardown,def test_func_1():,print test_func_1,assert True,def test_func_2():,print test_func_2,assert True,执行结果:,分析:,nose,在文件中如果找到函数,setup,setup_module,setUp,或者,setUpModule,等,那么会在该模块的所有测试执行之前执行该函数。如果找到函数,teardown,tearDown,teardown_module,或者,tearDownModule,等,那么会在该模块所有的测试执行完之后执行该函数。对于上面的代码,,nose,实际的执行过程是这样的:,setUp()-Testfunc1()-Testfunc2()-tearDown(),测试函数的,Setup,和,tearDown,def setUp():,print test setup,def tearDown():,print test teardown,def func_1_setup():,print test_func_1 setup,def func_1_teardown():,print test_func_1_teardown,def test_func_1():,print test_func_1 run,assert True,test_func_1.setUp=func_1_setup,test_func_1.tearDown=func_1_teardown,测试代码,测试函数的,Setup,和,tearDown,执行结果,结果分析,nose,对上面代码的具体执行顺序如下:,setUp()-func_1_setup()-test_func_1()-,func_1_teardown()-tearDown(),测试类的,Setup,和,tearDown,class TestCase():,var1=0,var2=0,def setUp(self):,self.var1=1,self.var2=2,print TestCase setup,def tearDown(self):,self.var1=0,self.var2=0,print TestCase teardown,测试代码,def test_func_1(self):,assert self.var1=self.var2,def test_func_2(self):,assert self.var1!=self.var2,测试类的,Setup,和,tearDown,执行结果,结果分析,这里,nose,会对每个类的测试方法单独创建类的实例,并且有单独的,setUp,和,tearDown,。,nose,对上面测试的顺序如下:,setUp()-Testfunc1()-TearDown()-setUp()-Testfunc2()-TearDown(),package,的,setUp,和,tearDown,package,的,setUp,和,tearDown,方法需要放在,_init_.py,这个文件中,整个,package,只执行一次,setUp,和一次,tearDown,nosetest,常用的命令行参数,a)-s,,不捕获输出,会让你的程序里面的一些命令行上的输出显示出来。例如,print,所输出的内容。,b)-v,,查看,nose,的运行信息和调试信息。例如会给出当前正在运行哪个测试。,c)-x,,在第一次失败时就停止执行。,nosetest,in OpenStack,自动化测试,所有用例:,$project_dir/run_tests.sh,Pep8,代码规范:,$project_dir/run_tests.sh-p,手动测试单个的用例,$project_dir/nosetests neutron/tests/unit/test_agent_config.py-s,Mock,Review,3,Python Mock,介绍,模拟测试框架,Python 3.3,标准库的一部分,Python Mock,应用场景,真实对象具有不可确定的行为,真实对象很难被创建,真实对象的某些行为很难触发,真实情况令程序的运行速度很慢,真实对象有用户界面,测试需要询问真实对象它是如何被调用的,真实对象实际上并不存在,Python Mock,Demo,删除文件功能,#!/usr/bin/envpython,#-*-coding:utf-8-*-,importos,defrm(filename):,os.remove(filename),Python Mock,Demo,删除文件测试用例,-1,tmpfilepath=os.path.join(tempfile.gettempdir(),tmp-testfile),defsetUp(self):,withopen(self.tmpfilepath,wb)asf:,f.write(Deleteme!),deftest_rm(self):,rm(self.tmpfilepath),self.assertFalse(os.path.isfile(self.tempfile),Failedtoremovethefile.),Python Mock,Demo,删除文件测试用例,-2,mock.patch(mymodule.os),def test_rm(self,mock_os):,rm(“any path”),mock_os.remove.assert_called_with(any path),Python Mock,Demo,import,collections,import,mock,thing,=,collections,.,Counter(),thing,.,method,=,mock,.,MagicMock(return_value,=,3),thing,.,method(3,4,5,key,=,value),thing,.,method,.,assert_called_with(3,4,5,key,=,value),thing,.,method,.,assert_called_with(3,4,6,key,=,value),Traceback(most recent call last):File,line 1,in,AssertionError,:Expected call:mock(3,4,6,key,=,value)Actual call:mock(3,4,5,key,=,value),Python Mock,Demo,mock_side,=,mock,.,Mock(side_effect,=KeyError,(foo),mock_side(),Traceback(most recent call last):,File,line 1,in,File/usr/lib/python2.7/site-packages/mock.py,line 955,in,_call_,return,_mock_self,.,_mock_call(,*,args,*,kwargs),File/usr/lib/python2.7/site-packages/mock.py,line 1010,in,_mock_call,raise,effect,KeyError,:foo,Devstack,Review,4,Devstack,介绍,OpenStack,开发、系统测试平台,自动化部署系统,自动化清理环境,与,master,分支保持一致,Devstack,安装和配置,git clone,devstack&./stack.sh,User/Group:stack,配置文件:,local.conf,localrc,Devstack,构成,stack.sh,clean.sh,/opt/stack,logs/stack.sh.log,logs/screen,$./stack.sh,horizon is now available at 127.0.0.1/,keystone is serving at 127.0.0.1:5000/v2.0/,examples on using novaclient command line is in exercise.sh,the default users are:,admin,and,demo,the password:,4f9a953e98ee57d922d9,This is your host ip:127.0.0.1,stack.sh completed in 79 seconds.,Devstack,运行,Tempest,Review,5,Tempest,OpenStack,集成测试项目,基于,unittest2,和,nose,单元测试框架开发,基本执行流程:,调用各个,OpenStack,组件的,API,验证,API,返回的结果,测试环境通过配置文件构建,nickawcloud:/,repos/tempest$./tempest/tools/conf_from_devstack-D./devstack/-o etc/tempest.conf,Output file already exists.Overwrite?y/NY,nickawcloud,:/,repos/tempest$cat etc/tempest.conf,nova,host=127.0.0.1,port=5000,apiVer=v2.0,path=tokens,user=,admin,api_key=,4f9a953e98ee57d922d9,tenant_name=,admin,ssh_timeout=300,build_interval=10,build_timeout=600,environment,image_ref=,3712ca26-f926-4725-9132-08ec1f6e452e,image_ref_alt=4,flavor_ref=1,flavor_ref_alt=2,create_image_enabled=true,resize_available=true,Tempest,典型测试,基于,devstack,开发环境的基础上,运行,tempest,。,Thanks,!,
展开阅读全文