python测试框架
在Python语言中应用最广泛的单元测试框架是unittest和pytest,unittest属于标准库,只要安装了Python解释器后就可以直接导入使用了,pytest是第三方的库,需要单独的安装。
1.白盒测试原理
在软件架构的层面来说,测试最核心的步骤就是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们可以称为白盒测试
2.自动化测试用例编写
3.unittest实战
unittest各个组件的介绍
- testCase测试⽤例:测试类继承unittest模块中的TestCase类后,依据继承的这个类来设置⼀个新的测试⽤例类和测试⽅法。
- 测试固件:测试固件表示⼀个测试⽤例或者多个测试以及清理⼯作所需要的设置或者准备。初始化合情理
- testSuite测试套件:测试套件顾名思义就是相关测试⽤例的集合。在unittest中主要通过TestSuite类提供对测试套件的⽀持。
- testRunner测试运⾏:管理和运⾏测试⽤例的对象。
- assert测试断⾔:对所测试的对象依据返回的实际结果与期望结果进⾏断⾔校验
- 测试结果:测试结果类管理着测试结果的输出,测试结果呈现给最终的⽤户来反馈本次测试执⾏的结果信息。
自动化测试用例要素包含:
1、前提条件 setUp()
2、测试步骤
3、结果验证
4、清理 tearDown()
4.unittest测试固件详解:
在unittest中测试固件依据方法可以分为两种执行方式,一种是测试固件只执行一次,另外一种是测试固件每次都执行,下面依据具体的案例来讲解二者
1.测试固件每次均执行
from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self) -> None:
self.driver.quit()
def test_baidu_title(self):
'''百度测试:验证百度首页的title'''
# assert self.driver.title=='百度一下,你就知道'
self.assertEqual(self.driver.title,'百度一下,你就知道')
def test_baidu_url(self):
'''百度测试:验证百度首页的url'''
assert self.driver.current_url=='https://www.baidu.com/'
def test_baidu_video(self):
'''百度测试:验证点击视频后跳转到视频的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('视频').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url.startswith('https://haokan.baidu.com/?sfrom=baidu-top'))
def test_baidu_map(self):
'''百度测试:验证点击地图后跳转到地图的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('地图').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
if __name__ == '__main__':
unittest.main(verbosuty=2)
执行如上的代码后,它的顺序为:测试固件-->测试用例,测试固件-->测试用例
2.测试固件只执行一次
使用的是类方法,这样测试固件只会执行一次的,⻅案例的代码:
from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.get('http://www.baidu.com')
cls.driver.implicitly_wait(30)
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
def test_baidu_title(self):
'''百度测试:验证百度首页的title'''
# assert self.driver.title=='百度一下,你就知道'
self.assertEqual(self.driver.title,'百度一下,你就知道')
def test_baidu_url(self):
'''百度测试:验证百度首页的url'''
assert self.driver.current_url=='https://www.baidu.com/'
def test_baidu_video(self):
'''百度测试:验证点击视频后跳转到视频的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('视频').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
self.driver.close()
self.driver.switch_to.window(nowhandler)
def test_baidu_map(self):
'''百度测试:验证点击地图后跳转到地图的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('地图').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
self.driver.close()
self.driver.switch_to.window(nowhandler)
unittest.main(verbosity=2)
5.测试用例执行顺序详解
在unittest中,测试点的执行顺序是依据ascill码来执行的,也就是说根据ASCII码的顺序加载,数字与字母的顺序为:0-9,A-Z,a-z,所以以A开头的测试用例方法会优先执行,以a开头会后执行。也就是根据数字的大小从小到大执行的,切记数字的大小值的是不包含test,值的是test后面的测试点的数字大小,
6.verbosity的详解
在unittest中,执行的时候默认是1,也就是unittest.main(verbosity=1),在verbosity有三个参数,分别是0,1,2,代表的意思具体如下:
0(静默模式):仅仅获取总的测试用例数以及总的结果
1(默认模式)
2(详细模式):测试结果会显示每个测试用例的所有相关信息
7.测试用例注意事项:
1、在⼀个测试类⾥⾯,每⼀个测试⽅法都是以test开头的,test不能是中间或者尾部,必须是开头,建议test_
2、每⼀个测试⽤例⽅法都应该有注释信息,这样在测试报告就会显示具体的测试点的检查点
3、在⾃动化测试中,每个测试⽤例都必须得有断⾔,⽆断⾔的⾃动化测试⽤例是⽆效的
4、最好⼀个测试⽤例⽅法对应⼀个业务测试点,不要多个业务检查点写⼀个测试⽤例
5、如果涉及到业务逻辑的处理,最好把业务逻辑的处理⽅法放在断⾔前⾯,这样做的⽬的是不要因为业务逻辑执⾏错误导致断⾔也是失败
6、测试⽤例名称最好规范,有约束
7、是否先写⾃动化测试的测试代码,在使⽤⾃动化测试⽅式写,本⼈觉得没必要,毕竟能够做⾃动化测试的都具备了功能测试的基本⽔平,所以没必要把⼀个业务的检查点写多次,浪费时间和⼈⼒成本。
8.测试套件详解
按测试类执行
from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.get('http://www.baidu.com')
cls.driver.implicitly_wait(30)
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
def test_baidu_title(self):
'''百度测试:验证百度首页的title'''
# assert self.driver.title=='百度一下,你就知道'
self.assertEqual(self.driver.title,'百度一下,你就知道')
def test_baidu_url(self):
'''百度测试:验证百度首页的url'''
assert self.driver.current_url=='https://www.baidu.com/'
def test_baidu_video(self):
'''百度测试:验证点击视频后跳转到视频的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('视频').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
self.driver.close()
self.driver.switch_to.window(nowhandler)
def test_baidu_map(self):
'''百度测试:验证点击地图后跳转到地图的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('地图').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
self.driver.close()
self.driver.switch_to.window(nowhandler)
if __name__ == '__main__':
# #按测试类来进行执行 调用TestLoader()当中的loadTestsFromTestCase的方法
suite=unnittest.TestLoader().loadTestsFromTestCase(baiduTest)
unnitest.TextTestRunner().run(suite)
按测试模块执行:
from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.get('http://www.baidu.com')
cls.driver.implicitly_wait(30)
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()
def test_baidu_title(self):
'''百度测试:验证百度首页的title'''
# assert self.driver.title=='百度一下,你就知道'
self.assertEqual(self.driver.title,'百度一下,你就知道')
def test_baidu_url(self):
'''百度测试:验证百度首页的url'''
assert self.driver.current_url=='https://www.baidu.com/'
def test_baidu_video(self):
'''百度测试:验证点击视频后跳转到视频的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('视频').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')
self.driver.close()
self.driver.switch_to.window(nowhandler)
def test_baidu_map(self):
'''百度测试:验证点击地图后跳转到地图的页面'''
nowhandler=self.driver.current_window_handle
self.driver.find_element_by_link_text('地图').click()
allhandlers=self.driver.window_handles
for handler in allhandlers:
if handler!=nowhandler:
self.driver.switch_to.window(handler)
self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))
self.driver.close()
self.driver.switch_to.window(nowhandler)
if __name__ == '__main__':
# 按模块来进行执行
suite = unnittest.TestLoader().loadTestsFromModule('test_baidu_class.py')
unnitest.TextTestRunner().run(suite)
9.批量执行所有的测试用例
import unittest
import os
def getTests():
'''加载所有的测试模块'''
suite=unittest.TestLoader().discover(
#找到被执行模块的路径
start_dir=os.path.dirname(__file__),
#加载路径下所有以test_开头的测试模块的文件
pattern='test_*.py' #正则表达式
)
return suite
def runSuite():
unittest.TextTestRunner().run(getTests())
runSuite()