一.  一个.py文件批量执行测试用例(一个.py文件下多个用例执行)

如果直接使用:unittest.main(),则按字母顺序执行,

对于前后之间又依赖关系的用例,需要按特定的顺序执行,则使用 suite.addTest(类名("方法名")),如这里按照新增,修改,删除的顺序,可以避免执行完毕后的测试数据处理。

    def test_modifyCategory(self):  ...
    def test_addCategory(self): ...
    def test_delCategory(self):  ...
if __name__=="__main__":
#unittest.main() suite=unittest.TestSuite()
suite.addTest(test_category("test_addCategory"))
suite.addTest(test_category("test_modifyCategory"))
suite.addTest(test_category("test_delCategory"))

二.单个.py文件如何生成html测试报告

(下载 HTMLTestRunner.py文件,放到 python安装包的 lib 目录下,打开IDLE ,输入 " import   HTMLTestRunner "若不报错,则说明导入成功)

1.在测试报告名中显示时间:(引入time包)   now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))

time.time():获取当前时间戳

time.ctime():获取当前时间的字符串

time.localtime():当前时间的struct_time形式

time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime()):获取特定格式的时间,通常用这个

2.TestSuite是个容器,往里面用addTest()添加测试用例

3.fielname定义报告保存的路径以及文件名

file是file类的构造函数,file(name[, mode[, buffering]])

file()函数用于创建一个file对象,它有一个别名叫open(),它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。

name是文件的名字。mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。

用w或a模式打开文件的话,如果文件不存在,那么就自动创建。

此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。

在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。

这里常用的为 file(filename,'wb'):以二进制形式打开文件 filename

4.runner定义测试报告格式,stream定义报告写入的二进制文件,title为报告的标题,description为报告的说明,runner.run()用来运行测试case,注意最后用fp.close()将文件关闭!

5.添加测试用例的中文注释:  在每个测试方法后面添加:  u"""  测试用例中文说明  """   即可!!!!!!

if __name__=="__main__":
#unittest.main() suite=unittest.TestSuite()
    suite.addTest(test_category("test_addCategory"))
suite.addTest(test_category("test_modifyCategory"))
suite.addTest(test_category("test_delCategory"))
    now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time())) 
filename='C:\\Users\\DELL\\Desktop\\2.a .py a report\\'+now+"category.html"
fp=file(filename,"wb")
runner=HTMLTestRunner.HTMLTestRunner( stream=fp, title=u"产品分类测试", description=u"用例执行情况")
runner.run(suite)
fp.close()

测试报告效果图如下:

三.多个.py文件如何执行,如何生成一个测试报告,结构优化

测试报告优化思路:(1)所有的测试用例(包括共通是登录)放到用例文件夹下(2)执行用例的py文件单独列出 (3) 所有生成的报告放到Report文件夹下

文件结构如下:新建一个__init__.py文件(注意是双下划线,里面导入所有的用例),和所有的测试案例一起放到 test_case文件夹下

新建一个 test_all.py执行文件,代码如下:

#coding=utf-8

import sys
sys.path.append("\test_case")
from test_case import *
import unittest
import HTMLTestRunner
import time #注意使用套件时,在单个py文件中下的多个用例用 (类名("方法名")),
#导入多个py的类下,用(py名.类名) suite=unittest.TestSuite()
suite.addTest(unittest.makeSuite(category.test_category))
suite.addTest(unittest.makeSuite(product.test_product)) now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
filename='C:\\Users\\DELL\\Desktop\\Report\\'+now+"test_all.html"
fp=file(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'产品管理和分类管理的自动化测试报告',description=u'测试用例结果')
runner.run(suite)
fp.close()

1.如果不创建__init__.py文件,用例执行的py文件将找不到引入的包,这里我们来普及一下包的导入过程中执行了什么操作:

(1)创建一个新的,空的module(类)对象

(2)将该对象加入到sys(系统)的module(类)中

(3)装载加入的module,此时会现在当前目录下寻找,后在python的path中寻找,而创建引用__init__.py 是为了标识它所在的文件夹(目录)是可引用的module!!!!!

2.把模块的路径通过sys.path.append(路径)添加到程序中,这里使用的是相对路径: \用例所在文件夹

3.当重新添加一个py文件一起执行时,需要两个地方改动:

(1)首先需要在 __init__.py文件下引入该py

(2)在用例执行的文件(test_all.py)下使用:  suite.addTest(unittest.makeSuite(py名.类名))  将此文件下的用例添加上去并执行!!!!!

第一步简化:使用数组进行loop

all=[category.test_category,product.test_product]
suite=unittest.TestSuite()
for a in all:
suite.addTest(a)

第二步简化:将上述操作专门写到一个py文件中,直接调用

第三步简化:实现自动查找用例文件夹下的py文件,自动添加到addTest中,(只需在__init__.py中导入包即可),不用每次都两个地方进行设置!!!!!!!

实现思路如下:

使用TestLoader:测试用例加载器,可以加载多个测试用例,返回一个测试套件

discover=unittest.defaultTestLoader.discover(allcase,pattern='start_*.py',top_level_dir=None)   找到指定目录下的指定的测试模块,如果不在顶级目录下,需要指定。

实现代码如下:

#coding=utf-8

import sys
import unittest
import HTMLTestRunner
import time,os #注意使用套件时,在单个py文件中下的多个用例用 (类名("方法名")),
#导入多个py的类下,用(py名.类名) allcase='C:\\Users\\DELL\\Desktop\\test_casea' #指明要自动查找的py文件所在文件夹路径
def createSuite(): #产生测试套件
testunit=unittest.TestSuite()
#使用discover找出用例文件夹下test_casea的所有用例
discover=unittest.defaultTestLoader.discover(allcase, #查找的文件夹路径
pattern='start_*.py', #要测试的模块名,以start开头的.py文件
top_level_dir=None) #测试模块的顶层目录,即测试用例不是放在多级目录下,设置为none
for suite in discover: #使用for循环出suite,再循环出case
for case in suite:
testunit.addTests(case)
print testunit
return testunit allcasenames=createSuite() now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
filename='C:\\Users\\DELL\\Desktop\\Report\\'+now+"test_all.html"
fp=file(filename,'wb') runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'产品管理和分类管理的自动化测试报告',description=u'测试用例结果')
runner.run(allcasenames) #执行case
fp.close()

可以看到运行结果如下:

四.问题汇总

截止到现在,涉及测试报告的所有内容介绍完毕,下面介绍一下上述过程中遇到的问题:

1.element not visible :页面上有两个结构类似的元素

解决方法:使用全路径的xpath(或者是往前定位,直到能区分出元素1和元素2)

2.搜索结果的数量为空,一定要在点击搜索按钮前后都设置等待,设置等待很重要!!!!!

3.新增产品时有多个下拉框选择,导致上一个选择后使下一个被覆盖,无法点击,

解决方法: 刚开始使用ul/li的定位方式时由于点两次,第一项点击后的覆盖到第二项导致第二项不可见,所以此方法导致部分项下拉选中失败为空!!

所以对于select的最好使用 Select(driver.find_element_by_id("gender")).select_by_value("2") ,注意导入包 
from selenium.webdriver.support.ui import Select

下面说一下两种下拉框:下拉框分为两种

(1)select下时option的
from selenium.webdriver.support.ui import Select
...
# 通过index进行选择
Select(driver.find_element_by_id("gender")).select_by_index(1)
# 通过value进行选择
Select(driver.find_element_by_id("gender")).select_by_value("2")
# 通过选项文字进行选择
Select(driver.find_element_by_id("gender")).select_by_visible_text("Male")

注:Select only works on <select> elements(Select只对<select>标签的下拉菜单有效).

(2)ul下的li
定位非<select>标签的下拉菜单中的选项,需要两个步骤,先定位到下拉菜单,再对其中的选项进行定位。
定位代码(选择硕士):
# 先定位到下拉菜单
drop_down = driver.find_element_by_css_selector("div#select2_container > ul")
# 再对下拉菜单中的选项进行选择
drop_down.find_element_by_id("li2_input_2").click()

注:也可以用此方法定位<select>标签的下拉菜单。

4.生成报告为空(python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报这样的错)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 97: ordinal not in range(128)
在python的Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:
Python代码
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
此时重启python解释器,执行sys.getdefaultencoding(),发现编码已经被设置为utf8的了,多次重启之后,效果相同,这是因为系统在python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。

截止到现在,总结一下自动化测试的思路与文件架构:

1.设计测试case: (按照正向思维,每个用例必须形成一个完整的流程,包括浏览器执行case,然后关闭)

分类管理为一个.py文件:里面包含4个用例(搜索,新增,修改,删除),按此执行顺序可以减少对测试数据的后续处理(如新增的需要进行删除),产品管理以此类推,此时有两个py文件。

.py文件的优化:

(1)登录模块化,直接在setUp方法中引用即可

(2)所有的共用模块都放到setUp方法中,直到登录到要测试的页面

2.一共需要三个文件夹:

测试用例文件夹:放所有的.py文,且有用例的py文件以start开头,并新增一个__init__.py文件

报告执行文件夹:使用discover对用例进行loop,测试报告设置

测试报告:专门放每天执行的文件测试报告

还有so many 问题------》》

1.即使是多个py文件放一起,也是按顺序执行,如何实现并行测试,减少执行时间?

2.如何进行测试的持续集成,进行定时任务每天都执行一次?

2.如何将每天执行的报告发送到指定的邮箱中?

下一节将会具体介绍这些问题的处理!!

python实例编写(7)---测试报告与测试套件(多个py文件,1个py文件内多个用例)的更多相关文章

  1. python实例编写(6)--引入unittest测试框架,构造测试集批量测试(以微信统一管理平台为例)

    ---恢复内容开始--- 一.python单元测试实例介绍 unittest框架又叫PyUnit框架,是python的单元测试框架. 先介绍一个普通的单元测试(不用unittest框架)的实例: 首先 ...

  2. python实例编写(2)--等待,一组对象,层级元素,frame对象处理

    一.设置等待 #coding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDri ...

  3. python Django编写接口并用Jmeter测试

    一.环境准备 python3.6.7 Pycharm 二.创建项目 我这里是在Django项目中新建了个APP,目录结构如下图所示: 那么怎么在已有的Django项目中新建APP并进行配置呢: 2.1 ...

  4. python实例编写(5)--异常处理,截图,用例设计

    一.python的异常处理 异常抛出处理机制: 1.若在运行时发生异常,解释器会查找相应的处理语句(handler) 2.若在当前函数无法找到,就将异常传给上层的调用函数,看是否能处理 3.如果在最外 ...

  5. python实例编写(1)--浏览器操作,元素操作

    一.浏览器操作 1.  back()与 forward() #coding=gbk //编码不一定是utf-8 from selenium import webdriver //导入包,也叫”模组“ ...

  6. python实例编写(4)--js,滚动条,cookie,验证码,获取特定属性的元素,实现原理

    一.调用js 执行方法:execute_script(script,*args) 场景一:在页面上直接执行调用js 场景二:在定位的某个元素上执行调用js 如:掩藏文字(提示插件 tooltip设置淡 ...

  7. python实例编写(3)--对话框,多窗口,下拉框,上传文件

    一.对话框: 例:点击百度的登录,弹出的小窗口 #coding=utf-8 from selenium import webdriver from time import sleep dr=webdr ...

  8. Robot Framework(四)创建测试套件

    2.3.1测试用例文件 Robot Framework测试用例是使用测试用例文件中的测试用例表创建的.这样的文件会自动从它包含的所有测试用例中创建一个测试套件.可以有多少测试用例没有上限,但建议少于1 ...

  9. python 读取excel数据并将测试结果填入Excel

    python 读取excel数据并将测试结果填入Excel 读取一个Excel中的一条数据用例,请求接口,然后返回结果并反填到excel中.过程中会生成请求回来的文本,当然还会生成一个xml文件.具体 ...

随机推荐

  1. 漫谈ELK在大数据运维中的应用

    漫谈ELK在大数据运维中的应用 圈子里关于大数据.云计算相关文章和讨论是越来越多,愈演愈烈.行业内企业也争前恐后,群雄逐鹿.而在大数据时代的运维挑站问题也就日渐突出,任重而道远了.众所周知,大数据平台 ...

  2. noip普及组2007 守望者的逃离

    守望者的逃离 描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座 ...

  3. 【Ubuntu16.04】 install nginx

    1. Download PGP key in order to pass the authentication of the nginx repository signature. click to ...

  4. JVM堆内存设置

    今天碰到了一个题目,讲的是关于堆内存的问题,题目如下   下面哪种情况会导致持久区jvm堆内存溢出? A.循环上万次的字符串处理 B.在一段代码内申请上百M甚至上G的内存 C.使用CGLib技术直接操 ...

  5. Spring Date Jpa on update current_timestamp 自动维护创建时间和更新时间

    在数据库里设置默认值current_timestamp可以维护创建时间,设置on update current_timestamp 可以维护更新时间.在JPA中应该如何去做呢?这里还是以上篇Topic ...

  6. 浅谈服务器对SEO的影响,该如何选择服务器?

    对于SEO,很多人想的都是怎么做好网站的内部优化,做好外部推广.其实SEO没什么技术含量,到网上搜别人的心得看,千篇一律,都是翻来覆去的说一样的东西,就像吃不同人做的馒头,吃来吃去就是一个味道.笔者经 ...

  7. Linux下C/C++和lua交互-Table

    本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边.  最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. ...

  8. spring-session 共享

    Spring session 共享 一.引入依赖 <dependency> <groupId>redis.clients</groupId> <artifac ...

  9. AHD-模拟高清芯片RN6752替代TVP5150/CJC5150

    RN6752功能:2路CVBS转BT656/601/1302高清视频解码芯片.产品特征输入:2路CVBS(不能同时输入)和S-VIDEO(一般不用)输出:BT601/656/1302支持NTSC,PA ...

  10. Visual Studio2017 远程调试 Remote Debugger

    前言 大家在使用vs打包后的文件部署到服务器后,有时候我们需要对线网的后台进行调试.但是它不像在VS中.这个时候我们该怎么调试呢? 微软想到了这一点,他们在 VS 中给我们提供了一个功能: Remot ...