联教测试部web自动化培训3unittest框架.docx

上传人:b****5 文档编号:6108312 上传时间:2023-01-03 格式:DOCX 页数:33 大小:1.17MB
下载 相关 举报
联教测试部web自动化培训3unittest框架.docx_第1页
第1页 / 共33页
联教测试部web自动化培训3unittest框架.docx_第2页
第2页 / 共33页
联教测试部web自动化培训3unittest框架.docx_第3页
第3页 / 共33页
联教测试部web自动化培训3unittest框架.docx_第4页
第4页 / 共33页
联教测试部web自动化培训3unittest框架.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

联教测试部web自动化培训3unittest框架.docx

《联教测试部web自动化培训3unittest框架.docx》由会员分享,可在线阅读,更多相关《联教测试部web自动化培训3unittest框架.docx(33页珍藏版)》请在冰豆网上搜索。

联教测试部web自动化培训3unittest框架.docx

联教测试部web自动化培训3unittest框架

WEB自动化测试培训3

2016/06/03

课程讲师

肖能尤

课程目的

熟悉和掌握Unittest单元测试框架

课程内容

1Unittest单元测试框架介绍

unittest是python的单元测试框架,在python的官方文档中,对unittest有详细的介绍,想更深一步研究的同学可以到去了解,当然,我这里也会接介绍的。

unittest单元测试提供了创建测试用例,测试套件以及批量执行的方案,unittest在安装pyhton以后就直接自带了,直接importunittest就可以使用。

作为单元测试的框架,unittest也是可以对程序最小模块的一种敏捷化的测试。

在自动化测试中,我们虽然不需要做白盒测试,但是必须需要知道所使用语言的单元测试框架,这是因为把selenium2的API全部学习完后,就会遇到用例的组织问题,虽然函数式编程和面向对象编程提供了对代码的重构,但是对于所编写的每个测试用例,总不能编写成一个函数(方法)来调用执行吧?

很显然,这是不明智的作法。

利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元,由测试容器组织起来,到时候直接执行,同时引入测试报告(这是一直所期望的),对于unittest部分,下面详细的依次介绍。

unittest各组件的关系为:

1.1unittest模块实战

unittest支持测试的自动化处理,也同时包含测试的初始化和结束测试,以及把测试用例按模块化封装成一个测试套件,来进行批量的处理。

在一个模块化的测试用例中,包含共同的代码,如公司教务网的登录的测试用例,都得先打开浏览器访问项目地址,执行测试用例完成后,关闭浏览器结束测试,一般开始使用“setUp”表示,结束使用“tearDown”,setUp和tearDown被称为测试固件。

在测试执行的时候,setUp首先被执行,而且仅会执行一次,这个方法执行通过后,不管后面的测试是否通过,都会执行tearDown来结束测试。

在unittest中,提供了TestRunner来为运行测试,该类对象提供了run方法,其中接受TestCase或者TestSuite参数,并且返回测试结果,一般经常使用的是TextTestRunner运行器,可以看成是测试容器。

下面写以教务网的登陆例子来验证登陆这个用例是否登陆成功来说明

备注:

切记在unittest中,测试用例必须以test开头。

实现的代码:

代码:

#-*-coding:

utf-8-*-

fromseleniumimportwebdriver

fromimportSelect

importunittest,time,re

classLogin:

defsetUp(self):

=()

=""

deftest_login(self):

'''checkloginsuccessorfail'''

driver=

("txtUserName").clear()

("txtUserName").send_keys("")

("txtPassword").clear()

("txtPassword").send_keys("123123")

(2)

(u"登录").click()

(1)

deftearDown(self):

if__name__=="__main__":

(verbosity=2)

运行结果:

 

脚本讲解:

我们来详细的介绍下如上的代码和输出结果,导入了unittest,创建了测试的类(测试模块名称),继承TestCase,在测试固件中分别写的测试时候的初始化和测试结束后资源释放的代码,中间test_login是测试用例,也就是自动化的测试用例,在主函数中,直接调用main(),在main中加入verbosity=2,这样测试的结果就会显示的更加详细。

这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值

0(静默模式):

你只能获得总的测试用例数和总的结果比如总共100个失败20成功80

1(默认模式):

非常类似静默模式只是在每个成功的用例前面有个“.”每个失败的用例前面有个“F”

2(详细模式):

测试结果会显示每个测试用例的所有相关的信息

在编写的每个case中,可以加注释,这样在测试结果中,我们就知道该case是测试那个功能的,如上的截图,依据测试结果,我们就知道第一个testcase是测试登陆的。

1.2构建测试套件

在介绍测试模块的时候,借助unittest测试框架编写了一个简单的case,在节中,来介绍怎么构建测试套件,测试套件顾名思义就是测试用例的容器。

在说明测试套件的时候,以老师平板的项目为案例,来说明测试套件在项目中的实际应用。

新建testCase的package,在package中创建test_a1_login登陆模块和test_a10_safe_custody安全监护模块等,见目录结构

test_a10_safe_custody模块代码:

#coding:

utf-8

fromappiumimportwebdriver

fromseleniumimportwebdriver

fromtimeimportsleep

fromimportBy

importunittest,sys

'./page')

fromimportAppTestCase

#安全监护

classSafe_custody(AppTestCase):

deftest_a1_Safe_custody(self):

'''首页-》安全监护'''

'安全监护').click()

deftest_a2_Safe_custody_bottom(self):

'''点击安全监护->讲台->底部'''

'安全监护').click()

"").click()

deftest_a3_Safe_custody_top(self):

'''点击安全监护->讲台->底部->顶部'''

'安全监护').click()

"").click()

"").click()

if__name__=='__main__':

(verbosity=2)

#

##构造测试集

#suite=()

#(Safe_custody("test_a3_Safe_custody_top"))

#

##执行测试

#runner=()

#(suite)

addTest的应用

当有多个或者几百测试用例的时候,这样就需要一个测试容器(测试套件),把测试用例放在该容器中进行执行,unittest模块中提供了TestSuite类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中。

在weke模块中编写了测试使用到的方法,下来我们test_a10_safe_custody模块中编写几个测试用例,以实例的方式来说明addTest的应用,见wekeTest模块中的代码和执行结果截图:

代码:

#coding:

utf-8

fromappiumimportwebdriver

fromseleniumimportwebdriver

fromtimeimportsleep

fromimportBy

importunittest,sys

'./page')

fromimportAppTestCase

#安全监护

classSafe_custody(AppTestCase):

deftest_a1_Safe_custody(self):

'''首页-》安全监护'''

'安全监护').click()

deftest_a2_Safe_custody_bottom(self):

'''点击安全监护->讲台->底部'''

'安全监护').click()

"").click()

deftest_a3_Safe_custody_top(self):

'''点击安全监护->讲台->底部->顶部'''

'安全监护').click()

"").click()

"").click()

if__name__=='__main__':

#构造测试集

suite=()

(Safe_custody("test_a1_Safe_custody"))

(Safe_custody("test_a2_Safe_custody_bottom"))

(Safe_custody("test_a3_Safe_custody_top"))

#执行测试

runner=(verbosity=2)

(suite)

运行结果:

依据执行结果的截图,可以很清楚的看到,先执行test_a1,至到test_a3,这是由如下代码决定的:

suite=()

(Safe_custody("test_a1_Safe_custody"))

(Safe_custody("test_a2_Safe_custody_bottom"))

(Safe_custody("test_a3_Safe_custody_top"))

suite是测试套件的实例,调用addTest()方法添加需要执行的case,顺序可以依次来,或者按自己的想法来,添加case到测试套件后,调用unittest模块中TextTestRunner类的run()方法,传入参数为测试套件的实例suite。

使用addTest方法,可以实现把测试的case添加到测试套件suite中,但是我个人不建议使用addTest()方法,理由很简单,如果测试case很多,都得需要添加,感觉是重复造轮子。

makeSuite()

在介绍addTest()方法的时候,就说到了它的缺点,重复造轮子并不是想要的,但是代码还是得一步一步的重构。

在unittest框架中提供了makeSuite()的方法,makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite,unittest调用makeSuite的时候,只需要把测试类名称传入即可。

把上面的代码使用makeSuite重构后为:

代码重构:

#coding:

utf-8

fromappiumimportwebdriver

fromseleniumimportwebdriver

fromtimeimportsleep

fromimportBy

importunittest,sys

'./page')

fromimportAppTestCase

#安全监护

classSafe_custody(AppTestCase):

deftest_a1_Safe_custody(self):

'''首页-》安全监护'''

'安全监护').click()

deftest_a2_Safe_custody_bottom(self):

'''点击安全监护->讲台->底部'''

'安全监护').click()

"").click()

deftest_a3_Safe_custody_top(self):

'''点击安全监护->讲台->底部->顶部'''

'安全监护').click()

"").click()

"").click()

if__name__=='__main__':

#构造测试集

suite=(Safe_custody))

#执行测试

runner=(verbosity=2)

(suite)

运行结果:

利用makeSuite方法,就不需要担心有多少个case了,只需要把测试的类传入即可。

TestLoader()

TestLoader用于创建类和模块的测试套件,一般的情况下,使用

TestLoader().loadTestsFromTestCase(TestClass)来加载测试类。

实现的代码:

#coding:

utf-8

fromappiumimportwebdriver

fromseleniumimportwebdriver

fromtimeimportsleep

fromimportBy

importunittest,sys

'./page')

fromimportAppTestCase

#安全监护

classSafe_custody(AppTestCase):

deftest_a1_Safe_custody(self):

'''首页-》安全监护'''

'安全监护').click()

deftest_a2_Safe_custody_bottom(self):

'''点击安全监护->讲台->底部'''

'安全监护').click()

"").click()

deftest_a3_Safe_custody_top(self):

'''点击安全监护->讲台->底部->顶部'''

'安全监护').click()

"").click()

"").click()

if__name__=='__main__':

#构造测试集

#suite=(Safe_custody))

suite=().loadTestsFromTestCase(Safe_custody)

#执行测试

runner=(verbosity=2)

(suite)

实现结果:

discover()

discover是通过递归的方式到其子目录中从指定的目录开始,找到所有测试模块并返回一个包含它们对象的TestSuite,然后进行加载与模式匹配唯一的测试文件,discover参数分别为discover(dir,pattern,top_level_dir=None)。

修改下之前的模块,把测试脚本的模块放在TestCase的模块下,把被调用测试的文件放在Page的模块下,见调整后的目录截图:

截图显示为调整后的目录结构,分别讲一个测试用例和run_teacherspad_test。

的实现源码。

test_a10_safe_custody模块的代码:

#coding:

utf-8

fromappiumimportwebdriver

fromseleniumimportwebdriver

fromtimeimportsleep

fromimportBy

fromimportTouchAction

importunittest,sys

'./page')

fromimportAppTestCase

classtask_online(AppTestCase):

#今日任务-上课

deftest_a1_attend_class1(self):

'''点击上课'''

'').click()

#今日任务-作业待改

deftest_a2_job_to_be_changed(self):

'''今日任务->"作业待改'''

'').click()

#今日任务-在线答疑

deftest_a3_task_online(self):

'''点击在线答疑'''

'').click()

#今日任务-在线答疑-查看全部

deftest_a4_task_onlineAll(self):

'''点击在线答疑-查看全部'''

'').click()

"lick()

 

#今日任务-在线答疑-查看第一个学生的所有在线答疑

deftest_a5_task_online_OneStu(self):

'''点击在线答疑-查看第一个学生的所有在线答疑'''

'').click()

"lick()

#今日任务-在线答疑-查看第一个(最新)提问详情

deftest_a6_task_online_firstQuestion(self):

'''点击在线答疑-查看第一个提问详情(列表中最新的问题)'''

'').click()

"lick()

 

#今日任务-在线答疑-答复第一个(最新)提问

deftest_a7_task_online_firstQuestion_reply1(self):

'''点击在线答疑-使用文字答复第一个提问(列表中最新的问题)'''

'').click()

"lick()

'').send_keys(u'你好')

'').click()

#今日任务-在线答疑-答复第一个(最新)提问

deftest_a8_task_online_firstQuestion_reply2(self):

'''点击在线答疑-使用音频答复第一个提问(列表中最新的问题)'''

'').click()

"lick()

'').click()

touch=TouchAction

''),5).perform()

#今日任务-在线答疑-公开第一个在线答疑

deftest_a9_task_online_firstQuestion_isPublic(self):

'''点击在线答疑-公开第一个提问(列表中最新的问题)'''

'').click()

"lick()

'').click()

#今日任务-在线答疑-不公开第一个在线答疑

deftest_a10_task_online_firstQuestion_isNotPublic(self):

'''点击在线答疑-不公开第一个提问(列表中最新的问题)'''

'').click()

"lick()

'').click()

#今日任务-在线答疑-第一个在线答疑-推荐课程

deftest_a12_task_online_firstQuestion_courses(self):

'''点击在线答疑-第一个提问(列表中最新的问题)-推荐课程'''

'').click()

"lick()

"lick()

#今日任务-在线答疑-搜索

deftest_a13_task_online_search(self):

'''点击在线答疑-搜索'''

'').click()

'').click()

#今日任务-在线答疑-搜索(班级)

deftest_a14_task_online_search1(self):

'''点击在线答疑-搜索-按班级搜索(三

(1)班)'''

'').click()

'').click()

"lick()

'').click()

#今日任务-在线答疑-搜索(发起人)

deftest_a15_task_online_search2(self):

'''点击在线答疑-搜索-按发起人搜索'''

'').click()

'').click()

'').send_keys('01')

'').click()

#今日任务-在线答疑-搜索(日期)

deftest_a16_task_online_search3(self):

'''点击在线答疑-搜索-按日期搜索'''

'').click()

'').click()

'').click()

'').click()

'').click()

 

#今日任务-在线答疑-搜索(结合搜索:

班级、发起人、日期)

deftest_a17_task_online_search4(self):

'''点击在线答疑-搜索-按班级、发起人、日期搜索'''

'').click()

'').click()

"lick()

'').send_keys('01')

'').click()

'').click()

'').click()

#今日任务-在线答疑-退出

deftest_a18_task_online_search_return(self):

'''点击在线答疑-搜索-退出在线答疑界面返回老师平板主界面'''

'').click()

'').click()

#今日任务-申诉

deftest_task_appeal(self):

'''点击申诉'''

'').click()

#执行所有用例

if__name__=='__main__':

(verbosity=2)

 

把测试执行的代码写在allTests的模块,该模块的源码为:

#!

/usr/bin/envpython

#coding:

utf-8

importHTMLTestRunner

importunittest

importtime

importos,sys

reload(sys)

('utf-8')

#定义测试用例的目录为当前目录的testcase目录

test_dir='./teacherspad/testCase'

discover=pattern='test*.py')

if__name__=='__main__':

now_time=("%Y-%m-%d%H_%M_%S")

fp=open("./teacherspad/report/"+now_time+'.html',"wb")

runner=(

stream=fp,

title=u'老师平板测试报告',

description=u'用例执行情况:

')

#runner=()

(discover)

()

注释:

对如上的代码进行解释,

discover=pattern='test*.py')是对discover的应用,第一个参数是放testcase的目录,第二个是使用了正则表达式,匹配目录下所有的测试模块,第三个参数默认为None

1.3执行测试

在unittest的模块中,提供了TestRunner类来进行运行测试用例,在实际的应用中,经常使用的是TextTestRunner类,执行后,会已文字的形式打印出测试结果,见测试代码和执行结果截图:

#coding:

utf-8

fromappiumim

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1