• 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

  • 相关阅读:
    [置顶] Blender 三维绘图及渲染软件 (开源优秀强大跨平台)
    观察力训练(福尔摩斯演绎法)
    Shiro 权限框架使用总结
    [置顶] 如何编写出优美的 JavaScript 代码
    TopCoder 入门教程 sqybi完善版
    开源 3D CAD 软件 gCAD3D 1.9.1 发布
    Java 局部内部类访问局部变量必须加 final 关键字
    [置顶] 程序员如何做出“不难看”的设计
    JavaFX DirectoryChooser[目录选择器]使用实例及源代码[图文]
    项目管理软件收集
  • 原文地址:https://www.cnblogs.com/lyang-a/p/15086626.html
Copyright © 2020-2023  润新知