zoukankan      html  css  js  c++  java
  • unittest测试框架(11)

    二、unittest测试框架
    1.unittest原名PyUnit,是Python语言自带的单元测试框架。Selenium WebDriver功能自动化测试和Appium手机自动化测试和接口测试都可以继承unittest框架来管理代码。
    2.集成unittest框架的原因:
    (1)在一个unittest的测试用例脚本文件里可以包含多个测试用例代码实现内容,可以统一管理,方便维护。
    (2)可以批量运行。
    (3)实现代码的复用。
    (4)有大量的日志。
    (5)提供了很多断言方法,利用它们检查界面上的数据。
    (6)测试结果报告展示得更清晰明了。
    3.用unittest框架做单元测试的步骤:
    (1)被测模块:day07包里的cal.py,新建Cal类,定义构造函数传入两个属性值代表两个加数,定义add函数实现两个加数加法计算功能,最后把结果用返回值返回。
    示例:day07cal.py

    class Cal():
        def __init__(self,x,y): --注意构造函数不要写错!
            self.x=x
            self.y=y
        def add(self):
            return self.x+self.y                

    (2)设计单元测试的测试用例:
    用例1:x=20 y=30,检查add函数能返回预期值50
    用例2:x=-100 y=-10 检查add函数能返回预期值-110
    用例3:x=1.3 y=2.1 检查add函数能返回预期值3.4
    ……
    (3)实现单元测试的测试代码:在day07包上右击菜单里选择New---Python file,选择文件类型是Python unit test,输入文件名称testcal,OK,自动生成了一些代码。
    示例:

    # 导入unittest模块
    import unittest
    # 定义一个类,默认类名是MyTestCase(可修改),该类是unittest模块里的TestCase类的子类。
    class MyTestCase(unittest.TestCase):
    # 以test开头命名的函数,叫做测试函数,至少要有1个
    def test_something(self):
    # 调用父类TestCase里提供的断言方法来检查数据。
    self.assertEqual(True, False)
    # 判断当前脚本代码没有被其他模块调用,自己独立运行时,一般在这个分支时,写测试代码来测试当前模块。
    if __name__ == '__main__':
    # 调用unittest模块里的main函数(程序执行入口),该函数会自动帮我们来实例化上面的测试用例类,并且自动依次调用所有测试函数。
    unittest.main()
    (4)#在测试代码(testcal.py)开头处导入被测模块里的被测类(cal.py里Cal类)。
    from day07.cal import Cal

    (5)每一条测试用例准备一个测试函数:比如有3条测试用例,就需要准备3个测试函数,实例化被测类,调用被测函数,接收返回来的数据,用父类里提供的断言方法检查该数据是否符合预期要求。
    示例:

    def test_1(self): ---test开头的函数就是测试函数
        c1=Cal(20,30) ---实例化被测类
        r1=c1.add() ---调用被测函数,接收返回来的数据
        self.assertEqual(50, r1) ---检查返回值
    def test_2(self):
        c2=Cal(-100,-10)
        r2=c2.add()
        self.assertEqual(-110,r2)
    def test_3(self):
        c3=Cal(1.3,2.1)
        r3=c3.add()
        self.assertAlmostEqual(3.4,r3,2)

    (6)运行代码时,建议把光标定位在代码末尾,右击菜单里选择Run Unittests……来运行,这样此类里所有测试函数都会参与运行。
    (7)补充:在每个测试函数执行前,如果都需要做相同的准备工作,可以把这样的步骤写在名称为setUp的函数里,在每个测试函数执行后,如果都需要做相同的收尾工作,可以把这样的步骤写在名称为tearDown的函数里。这样运行时按照setUp---test_xxx---tearDown---setUp---test_yyy---tearDown……这样的顺序来运行。
    示例:
    def setUp(self):
    print("做准备工作,例如打开数据库连接、打开外部文件等")
    def tearDown(self):
    print("做清理和收尾工作,例如关闭数据库连接、关闭外部文件等")
    4.用unittest框架做Selenium WebDriver测试的步骤:
    (1)案例:
    用例1:启动Firefox,打开ECShop前台首页,输入关键字a,点击搜索,等待3秒,关闭浏览器
    用例2:启动Firefox,打开ECShop前台登录页,输入用户名abc和密码123,点击“立即登陆”,等待3秒,关闭浏览器
    用例3:启动Firefox,打开ECShop前台留言板页,输入电子邮件地址lisi@123.com,点击“我要留言”,等待3秒,关闭浏览器。
    ……
    (2)新建day07包里的case7004.py,选择文件类型是Python unit test,导入selenium相关资源:
    示例:

    from selenium import webdriver
    from time import sleep
    from selenium.webdriver.common.by import By

    (3)在该类里定义名称是setUp的函数,在该函数体里写启动Firefox和隐式等待的步骤。
    注意:driver变量想要在整个类里使用,必须加self.
    示例:

    def setUp(self):
        self.driver=webdriver.Firefox()
        self.driver.implicitly_wait(15)

    (4)在该类里定义名称是tearDown的函数,在该函数体里写等待和关闭浏览器的步骤。
    示例:

    def tearDown(self):
        sleep(3)
        self.driver.quit()

    (5)按照测试用例数,创建多个测试函数,每个测试函数中书写打开xxx网页、定位xxx元素、操作xxx、检查xxx数据等步骤。
    示例:

    1 def test_1(self):
    2     self.driver.get("http://localhost/upload/index.php")
    3     guan=self.driver.find_element(By.ID,"keyword")
    4     guan.send_keys("a")         
    5     sou=self.driver.find_element(By.CLASS_NAME,"go")
    6     sou.click()    

    (6)运行时,把光标放在代码末尾,右击菜单里选择Run Unittests……



  • 相关阅读:
    Linux
    Linux
    JavaScript
    JavaScript
    Linux
    不可不说的Java“锁”事
    RabbitMQ公共配置
    求一个数字的补码
    项目中Controller的全局异常处理类
    如何较方便给上百张数据库表添加表字段
  • 原文地址:https://www.cnblogs.com/guog1/p/14154576.html
Copyright © 2011-2022 走看看