ps:我的小习惯,不管懂不懂,先去找找别人的实例,运行看看,再去仔细看看怎么用.....
目录
8、Fixture:装置函数(setUp、tearDown)
9、断言:让程序代替人为判断测试程序执行结果是否符合预期结果的过程
10、实例(根据自己要测试的网页,调整元素;大概是这么个模板)
1、什么是UnitTest框架
是python自带的一个单元测试框架,用它来做单元测试
2、为什么用UnitTest框架
能够批量执行用例
提供丰富的断言知识
可以生成测试报告
3、UnitTest的核心要素
TestCase:测试用例
TestSuite:测试套件
TextTestRunner:以文本的形式运行测试用例
TestLoader:批量执行测试用例,搜索指定文件夹内指定字母开头的模块(推荐)
Fixture:固定装置(两个固定的函数,一个初始化时使用,一个结束时使用
4、TestCase:测试用例---步骤--实例
1.导包:import unittest
2.测试方法必须以 test 字母开头
3.新建测试类并继承 unittest.TestCase
# 编写求和测试函数
# 导包
import unittest
# 编写求和函数
def add(x,y):
return x+y
# 定义测试类,并继承(定义类以大写字母开头)
class Test01(unittest.TestCase):
# 定义测试方法,以test字母开头
def test_add01(self):
# 调用
result = add(1,1)
print("结果为:",result)
def test_add02(self):
# 调用
result = add(2, 1)
print("结果为:", result)
print("——name——内置变量获取当前运行的模块名称:",__name__)
5、 TestSuite:测试套件
1.导包
2.获取测试套件对象 suite = unittest.TestSuite()
3.调用addTest()方法,添加测试用例
添加用例2:suite.addTest(unittest.makeSuite(类名)) #添加指定类中所有test开头的方法
添加用例1:suite.addTest(类名("方法名")) #添加指定类中指定测试方法
6、TextTestRunner:执行测试套件
1.导包
2.实例化后去执行套件对象:runner = unittest.TextTestRunner()
3.调用run方法去执行:runner.run(suite)
"""t03_TestSuite.py"""
"""
1、导包
2、实例化获取TestSuite对象
3、调用addTest方法添加用例到指定套件中
"""
import unittest
from script_unittest.t01_TestCase import Test01
from script_unittest.t01_TestCase import Test02
# 实例化,获取suite对象
suite = unittest.TestSuite()
# 调用添加方法
# 写法1 类名("方法名") # 方法名称使用双引号
suite.addTest(Test01("test_add01"))
suite.addTest(Test01("test_add02"))
# 写法2 扩展 添加测试类中所有test开头的方法
suite.addTest(unittest.makeSuite(Test02))
# 执行测试套件
runner = unittest.TextTestRunner()
runner.run(suite)
7、TestLoader:批量执行测试用例
1.将符合条件的测试方法添加到测试套件中
2.搜索指定目录文件下指定字母开头的模块文件下的test方法,并将这些方法添加到测试套件中,最后返回测试套件
3.步骤
导包:import unittest
调用TestLoader()
suite = unittest.TestLoader().discover("./cases",pattern="tpshop*.py")
suite = unittest.TestLoader().discover("指定搜索的目录文件",“指定字母开头的模块文件”)
执行测试套件
unittest.TextTestRunner().run(suite)
8、Fixture:装置函数(setUp、tearDown)
函数级别:def setUp() / def tearDown()
特性:几个测试函数执行几次
类级别:def setUpClass() / def tearDownClass()
类方法必须使用 @classmethod修饰
特性:测试类运行之前执行一次setUpClass,运行之前执行一次tearDownClass
模块级别:def setUpModule() / def tearDownModule()
模块运行之前执行一次setUpModule,运行之前执行一次tearDownModule
import unittest
class Test03(unittest.TestCase):
# 类方法修饰
@classmethod
def setUpClass(cls):
print("setUpClass被执行")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass被执行")
def setUp(self):
print("setUp被执行")
def tearDown(self) -> None:
print("tearDown被执行")
def test01(self):
print("test01被执行")
def test02(self):
print("test02被执行")
9、断言:让程序代替人为判断测试程序执行结果是否符合预期结果的过程
# 语法使用
import unittest
class Test04(unittest.TestCase):
def test01(self):
# # 断言是否为True
flag = True
self.assertTrue(flag)
# flag = False
# self.assertFalse(flag)
# 判断两个字符串是否相等
self.assertEqual("90","09")
# 判断后面的字符串是否包含前面的字符串
self.assertIn('119',"119 00")
self.assertIn("119 110","119,120,110")
10、实例(根据自己要测试的网页,调整元素;大概是这么个模板)
"""
输入:错误用户名或密码
断言:提示信息是否与预期结果一致
要求:如果断言出错,截屏保存
"""
# 导包
import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
# 定义测试类,并继承unittest.testcase
class TestcsdnLogin(unittest.TestCase):
# 定义初始化方法
def setUp(self) -> None:
# 获取浏览器驱动对象
self.driver = webdriver.Chrome()
# 打开url
self.driver.get("https://passport.csdn.net/login?code=applets")
# 浏览器窗口最大化
self.driver.maximize_window()
# 设置隐式等待
self.driver.implicitly_wait(10)
pass
# 定义teardown
def tearDown(self) -> None:
sleep(2)
self.driver.quit()
# 关闭浏览器驱动对象
pass
# 定义登录测试方法,用户名或密码错误
def test_login_code(self):
driver = self.driver
sleep(3)
# 点击登录链接,xpth的值核对下
driver.find_element(By.XPATH, "/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[1]/span[4]").click()
# 输入用户名,,xpth的值核对下
driver.find_element(By.XPATH,
"/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div/div[1]/div/input").send_keys(
"18700001111")
# 输入密码,xpth的值核对下
driver.find_element(By.XPATH,
"/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/div/div[2]/div/input").send_keys(
"Abc12345678")
# 勾选协议,,xpth的值核对下
driver.find_element(By.XPATH, "/html/body/div[2]/div/div[2]/div[2]/div[2]/div/div[2]/p/div/i").click()
# 点击登录
driver.find_element(By.CSS_SELECTOR, ".base-button").click()
sleep(2)
# 获取登录后的提示信息
result = driver.find_element(By.CLASS_NAME, "login-form-error").text
print("result为:", result)
# 定义预期结果
excert_result = "用户名或密码错误"
try:
# 断言
self.assertEqual(result,excert_result)
except AssertionError:
# 截图
driver.get_screenshot_as_file("../{}.png".format(time.strftime("%Y_%m_%d_%H_%M_%S")))
# 抛异常
raise