本文来自Python自动化测试实战(作者:无涯)学习衍生,学学他人的知识点,一步一步变为自己的知识点,也可以从中衍生新的测试思想与方法.
在一个测试类中会有很多个case,如何来组织并使用这些case呢?
untitest提供了“测试套件”方法,它由unittest模块中的TestSuite类表示,测试套件可以根据所测试场景的特性,把待执行的每条case组合在一起,达到实际业务要执行逻辑并输出预期的结果
接下来我会为大家大概介绍三种执行类型,三种方法来告诉大家如何实现更加快速便捷的管理执行case
1.按顺序执行
在实际的工作中,由于实际业务场景需要case按顺序执行,例如先执行A测试用例再执行B测试用例,在TestSuite类中提供了addTest方法可以实现,也就是说要执行的测试用例按自己期望的执行顺序添加到测试套件中。下面的案例实现对某系统的测试,测试用例的执行顺序是先执行testCase_001,再执行testCase_002,代码如下:
注解:在以上代码中,首先需要对TestSuite类进行实例化,使之成为一个对象suite,然后调用TestSuite类中addTest方法,把测试用例添加到测试套件中,最后执行测试套件,从而执行测试套件中的测试用例。运行以上代码后,测试用例会按照添加到测试套件的顺序执行,也就是说先添加进去的先执行,后添加进去的后执行;备注:一下代码是小编自己内部系统的简易自动化代码,仅供参考
# coding=utf-8
import os, time
# 导入HTMLTestRunner库,放在脚本的开头也是一样
import HTMLTestReportCN
import unittest
from selenium import webdriver
class TestAuto(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('start!')
cls.dr = webdriver.Chrome()
cls.dr.maximize_window()
print('测试浏览器为:{0}'.format(cls.dr.name))
time.sleep(1)
print(u'访问******测试环境后台管理系统')
cls.dr.get('访问地址')
print('测试地址为:{0}'.format(cls.dr.current_url))
time.sleep(1)
xpath = cls.dr.find_element_by_xpath
print(u'点击账号登录,进入账号密码待输入界面')
xpath('//*[@id="app"]/div/div[2]/div[2]/div/div[1]/div').click()
time.sleep(1)
# 捕捉账号文本栏 , 进行输入账号
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[1]/input').send_keys(u'账号')
time.sleep(1)
# 捕捉密码文本栏 , 进行输入密码
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[2]/input').send_keys(u'密码')
time.sleep(1)
print(u'点击登录')
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[3]/input').click()
print(u'初始环境,进入下一步验证')
@classmethod
def tearDownclass(cls):
print('end')
def testCase_001(cls):
'''验证用户是否登录完成'''
print(u'test_001:验证巡服带教后台登录')
cls.assertEqual('http://******.com.cn/#/', cls.dr.current_url)
url = 'http://******.com.cn/#/'
if url == 'http://*******.com.cn/#/':
print('..登录成功')
else:
print('..登录失败')
def testCase_002(cls):
'''进入门店评分报表页面_验证门店查看明细功能'''
print(u'test_002:验证查看门店评分详情功能')
xpath = cls.dr.find_element_by_xpath
time.sleep(2)
print(u'..点击门店评分报表明细进入门店评分报表页面')
xpath('/html/body/section/section/aside/ul/li[3]/span').click()
time.sleep(1)
print(u'..刷新门店评分报表页')
cls.dr.refresh()
time.sleep(2)
print(u'..点击列表第一页,第五行门店的查看按钮,进入门店信息详情')
xpath(
'/html/body/section/section/section/main/div[2]/div/div/div[2]/div[2]/div[1]/div[3]/table/tbody/tr[5]/td[10]/div/button/span').click()
# 断言门店详情页面制定元素是否展示的为神秘访客 判断页面是否成功跳转到详情页
text = xpath('/html/body/section/section/section/main/div[2]/div/div/div[1]/div[1]/p[1]').text
if text == '******':
print('..查询门店明细成功')
else:
print('..查询明细失败')
cls.assertEqual(u'******', text)
if __name__ == '__main__':
suiteTest = unittest.TestSuite()
suiteTest.addTest(TestAuto("testCase_001"))
suiteTest.addTest(TestAuto("testCase_002"))
unittest.TextTestRunner(verbosity=2).run(suiteTest)
# 按照一定时间格式获取当前时间(防止测试报告覆盖)
now = time.strftime(u'%Y-%m-%d-%H-%M-%S')
# 确定生成报告的路径
report_file = "F:\\python3\\report\\" + now + "_test_report.html"
with open(report_file, 'wb') as report:
runner = HTMLTestReportCN.HTMLTestRunner(stream=report, title=u'<http://*******.com.cn>巡服带教测试环境单元测试报告',
description=u'注:为减少时间人力成本,提高转测质量,特每次对测试环境待发布的代码会对基础功能模块进行单元测试,进一步的提高测试效率,如下为用例执行结果,请查阅!',
)
runner.run(suiteTest)
report.close()
在以上代码中,首先需要对 TestSuite 类进行实例化,使之成为一个对象suite,然后调用TestSuite类中addTest方法,把测试用例添加到测试套件中,最后执行测试套件,从而执行测试套件中的测试用例。运行以上代码后,测试用例会按照添加到测试套件的顺序执行,也就是说先添加进去的先执行,后添加进去的后执行
2.按测试类执行
在自动化测试中,一般测试用例往往多达几百个,如果完全按顺序来执行,其一是不符合自动化测试用例的原则,因为在UI 自动化测试中,自动化测试用例最好独立执行,互相之间不影响并且没有依赖关系。其二是当一个测试类中有很多测试用例时,逐一地向套件中添加用例是一项很烦琐的工作,这时,可以使用makeSuite类按测试类来执行。makeSuite可以实现把测试用例类中所有的测试用例组成测试套件TestSuite 这样可避免逐一向测试套件中添加测试用例。修改后的测试类中的代码如下:
# coding=utf-8
import os,time
# 导入HTMLTestRunner库,放在脚本的开头也是一样
import HTMLTestReportCN
import unittest
from selenium import webdriver
class TestAuto(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('start!')
cls.dr = webdriver.Chrome()
cls.dr.maximize_window()
print('测试浏览器为:{0}'.format(cls.dr.name))
time.sleep(1)
print(u'访问巡服带教测试环境后台管理系统')
cls.dr.get('http://*****.cn')
print('测试地址为:{0}'.format(cls.dr.current_url))
time.sleep(1)
xpath = cls.dr.find_element_by_xpath
print(u'点击账号登录,进入账号密码待输入界面')
xpath('//*[@id="app"]/div/div[2]/div[2]/div/div[1]/div').click()
time.sleep(1)
# 捕捉账号文本栏 , 进行输入账号
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[1]/input').send_keys(u'*****')
time.sleep(1)
# 捕捉密码文本栏 , 进行输入密码
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[2]/input').send_keys(u'*****')
time.sleep(1)
print(u'点击登录')
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[3]/input').click()
print(u'初始环境,进入下一步验证')
@classmethod
def tearDownclass(cls):
print('end')
def testCase_001(cls):
'''验证用户是否登录完成'''
print(u'test_001:验证巡服带教后台登录')
cls.assertEqual('http://****.com.cn/#/', cls.dr.current_url)
url = 'http://****.com.cn/#/'
if url == 'http:******.com.cn/#/':
print('..登录成功')
else:
print('..登录失败')
def testCase_002(cls):
'''进入门店评分报表页面_验证门店查看明细功能'''
print(u'test_002:验证查看门店评分详情功能')
xpath = cls.dr.find_element_by_xpath
time.sleep(2)
print(u'..点击门店评分报表明细进入门店评分报表页面')
xpath('/html/body/section/section/aside/ul/li[3]/span').click()
time.sleep(1)
print(u'..刷新门店评分报表页')
cls.dr.refresh()
time.sleep(2)
print(u'..点击列表第一页,第五行门店的查看按钮,进入门店信息详情')
xpath('/html/body/section/section/section/main/div[2]/div/div/div[2]/div[2]/div[1]/div[3]/table/tbody/tr[5]/td[10]/div/button/span').click()
# 断言门店详情页面制定元素是否展示的为神秘访客 判断页面是否成功跳转到详情页
text = xpath('/html/body/section/section/section/main/div[2]/div/div/div[1]/div[1]/p[1]').text
if text == '***':
print('..查询门店明细成功')
else:
print('..查询明细失败')
cls.assertEqual(u'***', text)
if __name__ == '__main__':
suiteTest = unittest.TestSuite(unittest.makeSuite(TestAuto))
'''
这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值
0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功80
1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
并且 你在命令行里加入不同的参数可以起到一样的效果
加入 –quiet 参数 等效于 verbosity=0
'''
unittest.TextTestRunner(verbosity=2).run(suiteTest)
# 按照一定时间格式获取当前时间(防止测试报告覆盖)
now = time.strftime(u'%Y-%m-%d-%H-%M-%S')
# 确定生成报告的路径
report_file = "F:\\python3\\report\\" + now + "_test_report.html"
with open(report_file, 'wb') as report:
runner = HTMLTestReportCN.HTMLTestRunner(stream=report, title=u'<http://*****.com.cn>巡服带教测试环境单元测试报告',
description=u'注:为减少时间人力成本,提高转测质量,特每次对测试环境待发布的代码会对基础功能模块进行单元测试,进一步的提高测试效率,如下为用例执行结果,请查阅!',
)
runner.run(suiteTest)
report.close()
3.按测试模块执行
在TestLoader类中也可以按模块来执行测试。在Python中,一个Python文件就是一个模块,一个模块中可以有 N个测试类,在一个测试类中可以有 N个测试用例。按模块执行的代码如下:(我们的python文件名为:seleniumtest.py)
# coding=utf-8
import os,time
# 导入HTMLTestRunner库,放在脚本的开头也是一样
import HTMLTestReportCN
import unittest
from selenium import webdriver
class TestAuto(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('start!')
cls.dr = webdriver.Chrome()
cls.dr.maximize_window()
print('测试浏览器为:{0}'.format(cls.dr.name))
time.sleep(1)
print(u'访问巡服带教测试环境后台管理系统')
cls.dr.get('http://******.com.cn')
print('测试地址为:{0}'.format(cls.dr.current_url))
time.sleep(1)
xpath = cls.dr.find_element_by_xpath
print(u'点击账号登录,进入账号密码待输入界面')
xpath('//*[@id="app"]/div/div[2]/div[2]/div/div[1]/div').click()
time.sleep(1)
# 捕捉账号文本栏 , 进行输入账号
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[1]/input').send_keys(u'***')
time.sleep(1)
# 捕捉密码文本栏 , 进行输入密码
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[2]/input').send_keys(u'***')
time.sleep(1)
print(u'点击登录')
xpath('//*[@id="app"]/div/div[2]/div[2]/div/form/div[3]/input').click()
print(u'初始环境,进入下一步验证')
@classmethod
def tearDownclass(cls):
print('end')
def testCase_001(cls):
'''验证用户是否登录完成'''
print(u'test_001:验证巡服带教后台登录')
cls.assertEqual('http://******.com.cn/#/', cls.dr.current_url)
url = 'http://*********com.cn/#/'
if url == 'http://*******.com.cn/#/':
print('..登录成功')
else:
print('..登录失败')
def testCase_002(cls):
'''进入门店评分报表页面_验证门店查看明细功能'''
print(u'test_002:验证查看门店评分详情功能')
xpath = cls.dr.find_element_by_xpath
time.sleep(2)
print(u'..点击门店评分报表明细进入门店评分报表页面')
xpath('/html/body/section/section/aside/ul/li[3]/span').click()
time.sleep(1)
print(u'..刷新门店评分报表页')
cls.dr.refresh()
time.sleep(2)
print(u'..点击列表第一页,第五行门店的查看按钮,进入门店信息详情')
xpath('/html/body/section/section/section/main/div[2]/div/div/div[2]/div[2]/div[1]/div[3]/table/tbody/tr[5]/td[10]/div/button/span').click()
# 断言门店详情页面制定元素是否展示的为神秘访客 判断页面是否成功跳转到详情页
text = xpath('/html/body/section/section/section/main/div[2]/div/div/div[1]/div[1]/p[1]').text
if text == '***':
print('..查询门店明细成功')
else:
print('..查询明细失败')
cls.assertEqual(u'****', text)
if __name__ == '__main__':
suiteTest = unittest.Testloader().loadTestsFromModule('seleniumtest.py')
'''
这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值
0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功80
1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”
2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
并且 你在命令行里加入不同的参数可以起到一样的效果
加入 –quiet 参数 等效于 verbosity=0
'''
unittest.TextTestRunner(verbosity=2).run(suiteTest)
# 按照一定时间格式获取当前时间(防止测试报告覆盖)
now = time.strftime(u'%Y-%m-%d-%H-%M-%S')
# 确定生成报告的路径
report_file = "F:\\python3\\report\\" + now + "_test_report.html"
with open(report_file, 'wb') as report:
runner = HTMLTestReportCN.HTMLTestRunner(stream=report, title=u'<http://*****.com.cn>巡服带教测试环境单元测试报告',
description=u'注:为减少时间人力成本,提高转测质量,特每次对测试环境待发布的代码会对基础功能模块进行单元测试,进一步的提高测试效率,如下为用例执行结果,请查阅!',
)
runner.run(suiteTest)
report.close()
注解:在以上代码中可以看到,测试类分别是BaiduMap和BaiduTest,模块名称为unittest1.py,TestLoader类直接调用loadTestsFromModule方法返回给指定模块中包含的所有测试用例套件。
后面我会在基于这集中测试方法上,补充一些可优化的点,最近工作比较繁忙,会抽空给大家分享好文,持续分享持续输出,希望本文对你们会有所帮助,也欢迎大家支持小编,进行分享,广而告之。