一、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:为测试套件名称)
4) FixTure
注意点:
必须继承unittest.TestCase类,setUp、tearDown才是一个Fixture;
setUp:一般做初始化工作,比如:实例化浏览器、浏览器最大化、隐式等待设置
tearDown:一般做结束工作,比如:退出登录、关闭浏览器
如果一个测试类有多个test开头方法,则每个方法执行之前都会运行setUp、结束时运行tearDown
以系统网页上查询功能为例
步骤如下:
1. 导包 import unittest
2. 新建测试类并继承unittest.TestCast
3. 新建一个Fixture(setUp、tearDown)
4. 新建登录方法
5. if __name__ == '__main__':
6. 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)
测试报告结果如下: