一、UnitTest框架
1、概念:UnitTest框架是专门用来进行执行代码测试的框架
2、作用:1)能够阻止多个用例去执行
2)提供丰富的断言方法
3)提供丰富的日志和测试结果
3、核心要素
1)TestCase:测试用例,一个testcase就是一条测试用例。
2)TestSuite:测试套件,多条测试用例集合在一起
3)TextTestRunner:测试执行,用来执行测试用例套件
4)FixTure:是一个概述,对一个测试用例环境的搭建和销毁就是一个Fixture
具体分析:
1)TestCase:测试用例必须以test开头。(原因:unittest.TestCase类批量运行的方法是搜索执行test开头的方法)
使用方法:
导包:import unittest --> 导入unitest框架
继承:unittest.TestCase --> 新建测试类继承unittest.TestCase
2)TestSuite:
一条测试用例(.py)内,多个方法也可以使用测试套件
TestSuite需要配合TextTestRunner才能被执行
使用:
实例化: suite=unittest.TestSuite() (suite:为TestSuite实例化的名称)
添加用例:suite.addTest("ClassName(MethodName)") (ClassName:为类名;MethodName:为方法名)
添加扩展:suite.addTest(unittest.makeSuite(ClassName)) (搜索指定ClassName内test开头的方法并添加到测试套件中)
3)TextTestRunner:
使用:
实例化: runner=unittest.TextTestRunner() (runner:TextTestRunner实例化名称)
执行: runner.run(suite) (suite:为测试套件名称)
- FixTure
注意点:
必须继承unittest.TestCase类,setUp、tearDown才是一个Fixture;
setUp:一般做初始化工作,比如:实例化浏览器、浏览器最大化、隐式等待设置
tearDown:一般做结束工作,比如:退出登录、关闭浏览器
如果一个测试类有多个test开头方法,则每个方法执行之前都会运行setUp、结束时运行tearDown
以系统网页上查询功能为例
步骤如下:
导包 import unittest
新建测试类并继承unittest.TestCast
新建一个Fixture(setUp、tearDown)
新建登录方法
if name == 'main':
unittest.main()执行
具体脚本如下:
1)先登录系统
登录系统写在初始化函数中
import unittest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class TestZhiku(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
# 隐式等待15s
self.driver.implicitly_wait(15)
# 浏览器窗口最大化
self.driver.maximize_window()
url = "**地址自己输入**"
# 打开浏览器地址,输入用户名和密码进行登录
self.driver.get(url)
self.driver.find_element(By.XPATH, "//*[@id='app']/div/div/div[2]/div[2]/img").click()
self.driver.find_element(By.CSS_SELECTOR, "input[placeholder = '请输入用户名']").send_keys("**用户名自己输入**")
self.driver.find_element(By.CSS_SELECTOR, "input[placeholder = '请输入密码']").send_keys("**密码自己输入**")
self.driver.find_element(By.XPATH, "//span[text() = '登录']").click()
2)进入查询页面,定位到关键字查询输入框输入关键字:测试
text01 = self.driver.find_element(By.XPATH, "//*[@id='app']/div/div[1]/div[3]/div[6]/span").text
self.driver.find_element(By.XPATH, "//*[text() = '项目工作台']").click()
self.driver.switch_to.frame("mainIframe") # 若有iframe内嵌,先切换进入到该iframe
self.driver.find_element(By.CSS_SELECTOR, "input[placeholder = '请输入关键字搜索']").send_keys("测试")
self.driver.find_element(By.XPATH, "//span[text() = '查询']").click()
3)获取页面数据,写一个方法进行调用
def get_page_data01(self, dri):
tab01 = self.driver.find_element(By.CSS_SELECTOR, "table.el-table__body")
rows01 = tab01.find_elements(By.TAG_NAME, "tr")
data01 = []
# 遍历每一行
for row01 in rows01:
# 在每一行中获取所有单元格
cells01 = row01.find_elements(By.TAG_NAME, 'td')
# 将单元格的文本添加到列表中
data01.append([cell.text for cell in cells01])
return data01
调用方法获取每一页的数据
page_data = TestZhiku.get_page_data01(self, self.driver)
# 获取每一页的数据
while True:
try:
# 假设下一页按钮有特定的class名,根据实际情况调整选择器
# element_to_be_clickable(locator)检查页面上指定的元素是否可见且可点击,可点击则返回该元素对象
next_page_button = WebDriverWait(self.driver, 15).until(
EC.element_to_be_clickable((By.CLASS_NAME, 'btn-next'))
)
next_page_button.click()
print(time.ctime())
time.sleep(3)
# 继续获取数据
page_data += TestZhiku.get_page_data01(self.driver)
except:
# 没有下一页了,退出循环
break
4)对比查询到的数据是否正确,若查询到的数据不包含关键字,则查询功能有误
text04 = "测试"
ass04 = True
for i in page_data:
if text04 not in i[3]:
print("查询到不包含关键字的内容")
ass04 = False
break
self.assertTrue(ass04)
5)执行脚本
if __name__ == '__main__':
unittest.main
6)若要出测试报告。加一下代码。放在另外的.py文件中
from HTMLTestRunner_cn import HTMLTestRunner
import unittest
import time
# 测试用例存放位置
test_dir = './test_case'
# 批量执行
discovery = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
if __name__ == '__main__':
report_dir = './test_rep'
now = time.strftime("%Y-%m-%d %H_%M_%S")
report_name = report_dir + '/' + now + 'result.html'
with open(report_name,'wb') as f:
runner = HTMLTestRunner(stream=f, title="Test Report",description="ceshilogin")
runner.run(discovery)
测试报告结果如下:
版权归原作者 璐小土豆 所有, 如有侵权,请联系我们删除。