目录
- 一、unittest框架基本介绍
- 二、unittest框架解析
- 三、unittest框架使用方法
- 1.测试固件
- 2.测试套件
- 3.用例的执行顺序
- 4.忽略测试用例中的方法
- 5.unittest断言
- 6.HTML报告生成
一、unittest框架基本介绍
在进行selenium IDE脚本录制导出的脚本中,我们发现其中多了很多代码,这些代码正是unittest测试框架。unittest 是web界面的功能测试框架,白盒测试测试框架是Junit。unittest 单元测试提供了创建测试用例、测试套件以及批量执行的方案。unittest 在安装python 以后就直接自带了,调用import unittest 就可以使用。
二、unittest框架解析
1.test fixture(测试固件):存了类里面固定的方法,初始化和清理测试环境,比如创建临时的数据库,文件和目录等
2.test case:单元测试用例,TestCase 是编写单元测试用例最常用的类
3.test suite(测试套件):把测试方法放到容器里,单元测试用例的集合,TestSuite 是最常用的类
4.test runner:执行单元测试
5.test report:生成测试报告
三、unittest框架使用方法
1.测试固件
一个方法一个方法的去写。
setup()进行初始化
teardown() 进行清理
Self 代表实例
Class 继承父类
from selenium import webdriver
import unittest
import time
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.common.by import By
#setup和teardown在每次运行test_程序之前和之后都会默认运行
class testCase1(unittest.TestCase):
#初始化
def setUp(self):
self.driver = webdriver.Chrome()
self.url = "http://www.baidu.com/"
self.driver.get(self.url)
time.sleep(3)
self.driver.maximize_window()
time.sleep(3)
#关闭以及清理
def tearDown(self):
self.driver.quit()
#自动默认运行前面加test_
def test_baidu1(self):
driver = self.driver
driver.find_element(By.ID, "kw").send_keys("星黛露")
driver.find_element(By.ID, "su").click()
time.sleep(3)
#调用才使用
def is_alert_exist(self):
try:
self.driver.switch_to.alert
except NoAlertPresentException as e:
return False
return True
if __name__ == "__main__ ":
unittest.main(verbosity=0)
2.测试套件
测试套件:通俗来讲就是存放测试用例(测试方法)的一个容器。
(1)类里面一个方法一个方法添加
test001和test002都是文件,testCase1和testCase2是文件里的类可以称之为测试用例,test_baidu1和test_baidu2是类里的方法。
Addtest
import unittest
from src0303 import test001, test002
#创建一个测试套件
def createsuite():
suite=unittest.TestSuite()
suite.addTest(test001.testCase1("test_baidu1"))
suite.addTest(test002.testCase2("test_baidu1"))
return suite
if __name__ == "__main__":
suite = createsuite()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
(2)一个类一个类的添加
makeSuite():只是添加文件里的类,类里的方法不用一个一个的添加。
import unittest
from src0303 import test001, test002
def createsuite():
suite=unittest.TestSuite()
suite.addTest(unittest.makeSuite(test001.testCase1))
suite.addTest(unittest.makeSuite(test001.testCase2))
return suite
if __name__ == "__main__":
suite = createsuite()
runner = unittest.TextTestRunner(verbosity=1)
runner.run(suite)
(3) 一个文件一个文件的测试
适用于文件非常多的时候,文件要是一定格式命名的。
discover()
#src202201文件夹,找到test00*.py开头的文件夹
import unittest
def createSuite():
discover=unittest.defaultTestLoader.discover('../src202201',pattern='test00*.py',top_level_dir=None)
if __name__=="__main__":
suite = createsuite()
runner = unittest.TextTestRunner(verbosity=1)
runner.run(suite)
注:Verbosity=1或者2表示打印方法很详细,如下:
3.用例的执行顺序
unittest框架(文件名,类名,方法名-)默认加载测试用例的顺序是根据ASCII码的顺序,数字与字母的顺序为:0-9,A-Z,a-z。例如:Testadd比Testade优先执行。
4.忽略测试用例中的方法
适用于书写方法太多,但是只想执行少数测试用例的情况。在想忽略的方法前加标签@。
@unittest.skip("skipping")
5.unittest断言
(1)断言概念
断言是为了判断实际和预期结果是否一致。自动化的测试中, 对于每个单独的case来说,一个case的执行结果中, 必然会有期望结果与实际结果, 来判断该case是通过还是失败, 在unittest 的库中提供了大量的实用方法来检查预期值与实际值, 来验证case的结果, 一般来说, 检查条件大体分为等价性, 逻辑比较以及其他, 如果给定的断言通过, 测试会继续执行到下一行的代码, 如果断言失败, 对应的case测试会立即停止或者生成错误信息( 一般打印错误信息即可) ,但是不要影响其他的case执行。
(2)常用断言方法
断言方法 | 断言描述 |
---|---|
assertEqual(arg1, arg2, msg=None) | 验证arg1=arg2,不等则fail |
assertNotEqual(arg1, arg2, msg=None) | 验证arg1 != arg2, 相等则fail |
assertTrue(expr, msg=None) | 验证expr是true,如果为false,则fail |
assertFalse(expr,msg=None) | 验证expr是false,如果为true,则fail |
assertIs(arg1, arg2, msg=None) | 验证arg1、arg2是同一个对象,不是则fail |
assertIsNot(arg1, arg2, msg=None) | 验证arg1、arg2不是同一个对象,是则fail |
assertIsNone(expr, msg=None) | 验证expr是None,不是则fail |
assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail |
assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail |
assertIn(arg1, arg2, msg=None) | 验证arg1不是arg2的子串,是则fail |
assertIsInstance(obj, cls, msg=None) | 验证obj是cls的实例,不是则fail |
assertNotIsInstance(obj, cls,msg=None) | 验证obj不是cls的实例,是则fail |
以第一个断言举例: |
class testCase1(unittest.TestCase):
#初始化
def setUp(self):
self.driver = webdriver.Chrome()
self.url = "http://www.baidu.com/"
self.driver.get(self.url)
time.sleep(3)
self.driver.maximize_window()
time.sleep(3)
#关闭以及清理
def tearDown(self):
self.driver.quit()
#自动默认运行前面加test_
def test_baidu1(self):
driver = self.driver
driver.find_element(By.ID, "kw").send_keys("星黛露")
driver.find_element(By.ID, "su").click()
time.sleep(3)
#判断title(星黛露的百度搜索)与"星黛露_百度搜索"是否相同,若不相同输出“not equal”并调用is_alert_exist(self)报异常,此处是相等的。
self.assertEqual(driver.title,"星黛露_百度搜索",msg="not equal!")
#调用才使用
def is_alert_exist(self):
try:
self.driver.switch_to.alert
except NoAlertPresentException as e:
return False
return True
if __name__ == "__main__ ":
unittest.main(verbosity=0)
6.HTML报告生成
将控制台结果整理成结果,涉及失败的原因和结果。将HTMLTestRunner.py放到安装python的lib文件夹里。
未完待更新…