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

原文地址:https://www.cnblogs.com/lyang-a/p/15086626.html