unittest框架
unittest 框架
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。
unittest框架是Python自带的,所以不需要使用pip命令进行安装。
unittest框架的使用步骤:
1、导包 import unittest
2、自定义一个测试类,继承unittest.TestCase, 最好类名也要以Test开头
3、在自己的测试类里面写的测试方法必须以 test开头
unittest相关属性
unittest.TestCase:TestCase类,所有测试用例类继承的基本类
unittest.main():可以将一个单元测试模块变为可直接运行的测试脚本
unittest.TestSuite():unittest框架的TestSuite()类是用来创建测试套件的
unittest.TextTestRunner(verbosity=2):unittest框架的TextTestRunner()类,通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件。verbosity 表示测试的详细信息,默认verbosity=1
unittest.defaultTestLoader():defaultTestLoader()类,通过该类下面的discover()方法可自动更具测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。
discover = unittest.defaultTestLoader.discover("./", pattern="test_*.py")
TestCase类的属性
setUp()方法:用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。
tearDown()方法:用于测试用例执行之后的善后工作。如关闭数据库连接、关闭浏览器。
assert*():一些断言方法。在执行测试用例的过程中,判断测试得到的实际结果和预期结果是否一致。
断言方法 | 断言描述 |
---|---|
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 |
assertIsNone(expr, msg=None) | 验证expr是None,不是则fail |
assertIsNotNone(expr, msg=None) | 验证expr不是None,是则fail |
assertIn(arg1, arg2, msg=None) | 验证arg1是arg2的子串,不是则fail |
示例:
# unittest框架是Python自带的,所以不需要使用pip命令进行安装
import unittest
# 自定义一个测试类
class TestLogin(unittest.TestCase):
# -> None 表示方法没有返回值,加不加都可以
def setUp(self) -> None:
# 主要完成测试的初始化工作,比如:创建浏览器驱动对象
print("测试用例方法执行之前先执行setUp方法!")
def tearDown(self) -> None:
# 主要完成测试的收尾工作,比如: 关闭浏览器驱动对象
print("测试用例方法执行完毕后会执行tearDown方法!")
# 登录成功的测试用例方法
def test_success_login(self):
print("登录成功的测试用例执行啦...")
assert "首页" == "首页"
# 登录失败的测试用例方法
def test_fail_login(self):
print("登录失败的测试用例执行啦...")
assert False
# 判断是否是主模块
if __name__ == '__main__':
unittest.main()
TestSuite类的属性
addTest()方法:将测试用例添加到测试套件中
# suite.addTest(类名("方法名字符串"))
# suite.addTest(TestLogin("test_success"))
# suite.addTest(TestRegister("test_register"))
# test_cases = [类名1("方法名字符串"),类名2("方法名字符串")]
suite_list = [
TestLogin("test_success"),
TestRegister("test_register")
]
suite.addTests(suite_list)
TextTestRunner类的属性
表示测试的执行器,它是用于执行测试套件,把测试套件中每一个测试方法都要去执行
run()方法:是运行测试套件的测试用例,入参为suite测试套件。
案例:
模拟登陆QQ邮箱
注意:编写的测试用例方法需以 test 开头
import time
import unittest
from selenium import webdriver
# 登录QQ邮箱测试
class TestVisit(unittest.TestCase):
# 执行之前
def setUp(self) -> None:
# 创建浏览器驱动对象
self.driver = webdriver.Chrome()
# 窗口最大化
self.driver.maximize_window()
# 设置隐式等待,防止元素没有准备好
self.driver.implicitly_wait(10)
self.driver.get("https://mail.qq.com/")
# 定位frame元素
self.driver.switch_to.frame("login_frame")
self.driver.find_element_by_id("switcher_plogin").click()
# 执行之后
def tearDown(self) -> None:
time.sleep(5)
self.driver.quit()
def common_test_param(self, user, pwd):
time.sleep(1)
self.driver.find_element_by_id("u").send_keys(user)
time.sleep(1)
self.driver.find_element_by_id("p").send_keys(pwd)
time.sleep(2)
self.driver.find_element_by_id("login_button").click()
# 登录失败
# 编写的测试用例方法需以 test开头
def test_err(self):
self.common_test_param("2411135390@qq.com", "64147515")
err_m = self.driver.find_element_by_id("err_m")
time.sleep(0.5)
assert err_m.text == "你输入的帐号或密码不正确,请重新输入。", "断言失败,帐号或密码不正确!"
# 登录成功
def test_success(self):
self.common_test_param("2411135390@qq.com", "64147515*.")
self.driver.switch_to.window(self.driver.window_handles[-1])
exits = self.driver.find_element_by_xpath("//a[text()='退出']")
time.sleep(0.5)
assert exits.text == "退出", "登录成功!"
if __name__ == '__main__':
TestVisit.mian()
PO模式
PO模式的全名叫做Page Object:页面-对象模式。适用于UI自动化编程。
核心思想:每一个操作的页面都抽象一个对应的类,页面中使用的元素封装属性,对元素的操作封装方法。
优点:方便管理和提高代码的可维护型、复用性。
案例:
使用PO模式测试京东搜索
说明:
base包:管理页面的公共操作模块
page包:管理每个页面的抽象模块
scripts包:管理业务操作模块
report:生成报告目录
main.py:程序入口模块
代码下载地址:https://gitee.com/LYANG-A/PO_J D_Search