1.unittest的内容
1.1TestCase
# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))
import unittest
def add(x, y):
return x + y
# test无需调用(实例化)
class Test01(unittest.TestCase):
def test01_add(self):
result = add(1, 3)
print(result)
print("__name__的值:",__name__)
def test02_add(self):
result = add(1, 2)
print(result)
if __name__ == '__main__':
unittest.main()
# __name__的值分为模块名和__main__
1.2TestSuite,TextTestRunner
# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))
import unittest
from script03.test01_Unittest_TestCase import Test01
# 实例化
suite = unittest.TestSuite()
# 调用增加方法,类名(“方法名”)
# 方法一
# suite.addTest(Test01("test01_add"))
# suite.addTest(Test01("test02_add"))
# 方法二
# 选中所有以test开头的方法
suite.addTest(unittest.makeSuite(Test01))
# 实例化
runner = unittest.TextTestRunner()
# 以文本的形式执行测试套件
runner.run(suite)
1.3TestLoader
# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))
import unittest
# TestLoader()批量执行以什么开头的模块文件
# /cases路径,test*.py表示以test开头的py文件
suite = unittest.TestLoader().discover("cases", pattern="test*.py")
# defaultTestLoader===TestLoader()
# defaultTestLoader是将TestLoader()实例化了
# suite=unittest.defaultTestLoader.discover("/cases",pattern="test*.py")
unittest.TextTestRunner().run(suite)
# TestLoader与TestSuite都是测试套件,但实现方法不同
# TestLoader为批量执行以什么开头的模块文件
# TestSuite要么添加类中所有的test方法,要么添加其中的某个,而且还需要导包
1.4Fixture
# TestCase(测试用例)
# TestSuite(测试套件)
# TextTestRunner(以文本的形式运行测试用例)
# TestLoader(批量执行测试用例,搜索指定文件夹内指定字母开头的模块)
# Fixture(固定装置(两个函数,一个初始化时用,一个结束时用))
import unittest
# fixture的级别,函数级别,类级别,模块级别
# 模块级别(基本不用,知道就行)
def setUpModule():
print("setUpModule..")
def tearDownModule():
print("tearDownModule..")
# 无论是类级别还是函数级别都是以下用途
# setUp与setUpClass初始化:1.获取浏览器实例化对象,2.最大化浏览器,3.隐式等待
# tearDown与tearDownClass结束:关闭浏览器驱动对象
class Test01(unittest.TestCase):
# 类级别
@classmethod
def setUpClass(cls):
print("setUpClass...")
@classmethod
def tearDownClass(cls):
print("tearDownClass..")
def setUp(self):
print("setup...")
def tearDown(self):
print("tearDown..")
# 函数级别
def test01(self):
print("test01..")
def test02(self):
print("test02..")
def test03(self):
print("test03..")
1.5assert
import time
import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
# def test001(self):
# # 是否为True,false
# self.assertTrue()
# self.assertFalse()
# # assertEqual()是否相等
# self.assertEqual()
# self.assertNotEqual()
# # assertIn方法判断后面的字符串是否包含前面的字符串
# self.assertIn("xxx", "xxxx")
# self.assertNotIn()
# # 是否为空
# self.assertIsNone()
class Test01(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Edge()
self.driver.get("https://www.tp-shop.cn/")
self.driver.maximize_window()
self.driver.implicitly_wait(10)
def tearDown(self):
sleep(2)
self.driver.quit()
def test001(self):
driver = self.driver
sleep(1)
driver.find_element(By.PARTIAL_LINK_TEXT, "登录").click()
sleep(1)
driver.find_element(By.CSS_SELECTOR, "[name='username']").send_keys("13800001111")
sleep(1)
driver.find_element(By.CSS_SELECTOR, "[name='password']").send_keys("123456")
sleep(1)
driver.find_element(By.CSS_SELECTOR, "#login-ver").send_keys("xxx")
sleep(1)
# 这里不知道为啥.login-btn对,input[value=''登录]错
driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
sleep(1)
result = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
print(result)
expect_result = "验证码错误!!"
try:
# 当实际结果与预期结果不同时截屏
self.assertEqual(result, expect_result)
except AssertionError:
# driver.get_screenshot_as_file("../image/%s.png" % (time.strftime("%Y_%m_%d_%H_%M_%S")))
driver.get_screenshot_as_file("../image/{}.png" .format(time.strftime("%Y_%m_%d_%H_%M_%S")))
# python自带的assert(不用python的unittest模块)
# assert "hello" == "hello"
# assert "h" in "hello"
1.6参数化
test.json为:
[
{
"username": "13800001111",
"password": "123456",
"loginver": "xx",
"expect_result" : "验证码错误!!"
},
{
"username": "",
"password": "123456",
"loginver": "xx",
"expect_result" : "验证码错误!!"
}
]
import json
import time
import unittest
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from parameterized import parameterized
def build_data():
with open('test.json', encoding='utf-8') as f:
result = json.load(f)
data = []
for i in result:
# 这里一定要注意,要把每次添加的数据转化为元组,不然会报错
# 报错的原因是因为parameterized只能支持每组数据是元组
data.append((i.get('username'), i.get('password'), i.get('loginver'),i.get('expect_result')))
return data
# unittest无法实现参数化,需要安装parameterized
class Test01(unittest.TestCase):
# setUp在有多个测试用例的时候需要启动多次浏览器,这很不方便,故,可以使用setUpClass,但要注意清空
def setUp(self):
self.driver = webdriver.Edge()
self.driver.get("https://www.tp-shop.cn/")
self.driver.maximize_window()
self.driver.implicitly_wait(10)
# tearDown也要换为tearDownClass
def tearDown(self):
sleep(2)
self.driver.quit()
# 单个参数["1","2","3"],多个参数[(1,2,3),(1,2,3),(1,2,3)]
@parameterized.expand(build_data())
def test001(self,username,password,loginver,expect_result):
driver = self.driver
sleep(1)
driver.find_element(By.PARTIAL_LINK_TEXT, "登录").click()
sleep(1)
driver.find_element(By.CSS_SELECTOR, "[name='username']").send_keys(username)
sleep(1)
driver.find_element(By.CSS_SELECTOR, "[name='password']").send_keys(password)
sleep(1)
driver.find_element(By.CSS_SELECTOR, "#login-ver").send_keys(loginver)
sleep(1)
# 这里不知道为啥.login-btn对,input[value=''登录]错
driver.find_element(By.CSS_SELECTOR, ".login-btn").click()
sleep(1)
result = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
print(result)
# expect_result = "验证码错误!!"
try:
self.assertEqual(result, expect_result)
except AssertionError:
# driver.get_screenshot_as_file("../image/%s.png" % (time.strftime("%Y_%m_%d_%H_%M_%S")))
# {}与.format()
driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d_%H_%M_%S")))