单元测试系列篇(二):unittest

本文是单元测试系列的第二篇,重点介绍了unittest框架中的Fixture、discover功能和装饰器的使用。Fixture包括setUp/tearDown等方法,用于管理测试用例执行逻辑。discover方法用于按规则查找测试用例,而装饰器如skip/skipIf/expecetdFailure则提供了灵活的测试控制。此外,文章还给出了unittest结合Selenium进行Web自动化测试的实战步骤。

点击上方“Python自动化社区”,选择“加为星标”

第一时间关注 Python 自动化技术干货!

系列导读

01. 单元测试系列篇(一):unittest

1. 前言

上一篇文章讲了 unittest 的基本用法,通过这部分内容可以编写一些测试用例,完成一些简单的单元测试。

本篇将继续聊聊 unittest 框架中的 Fixture、装饰器、discover、Web 自动化实战相关的内容。

2. Fixture

Fixture 是软件测试中的概念,相当于是一个钩子函数,unittest 框架提供了下面 3 组方法来管理测试用例的前后执行逻辑。

  • setUp() / tearDown()

  • setUpClass() / tearDownClass()

  • setUpModule() / tearDownModule()

其中,setUpModule() / tearDownModule() 是在整个模块的开始和结束的时候来调用。

setUpClass() / tearDownClass() 是在测试类的开始和结束时来进行调用。

至于 setUp() / tearDown(),是在执行每一个测试用例的开始、结束时进行调用。

需要注意的是,setUpClass() / tearDownClass() 为类方法,必须通过 @classmethod 装饰器,参数为:cls,代表测试类的实例对象。

import unittest

def setUpModule():
    pass
def tearDownModule():
    pass

class TestFoo(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        pass

    @classmethod
    def tearDownClass(cls):
        pass

    def setUp(self):
        pass

    def tearDown(self):
        pass

    //下面编写测试用例
    // pass

3. discover

unittest 框架可以使用 TestLoader 类下的 discover() 按照指定的规则去查找测试用例。

使用方法如下:

# 查找测试用例去执行
discover(start_dir,pattern="*.py",top_level_dir=None)

其中,start_dir 参数指定待测试的模块名或者测试用例目录

pattern 可以指定一个规则,利用文件名去匹配准备测试用例文件

top_level_dir 表示测试模块的顶级目录,如果没有顶级目录,默认为:None

比如,现在要查找某个相对目录下的,文件名以 test 开头的所有文件的测试用例组成的测试套件

import unittest

# 指定待测试用例的目录
test_dir_to_be = './testcase'

# 查找测试套件
suits = unittest.defaultTestLoader.discover(test_dir_to_be, pattern='test*.py', top_level_dir=None)

最后,利用 TestRunner 运行测试套件即可。

if __name__ == '__main__':
    # 实例化TestRunner
    runner = unittest.TextTestRunner()
    # 执行测试套件:suits
    runner.run(suits)

需要注意的是,为了保证 discover 查找到所有的测试用例,需要保证每一个子目录都包含一个 init.py 文件。

4. 装饰器

为了保证单元测试的高效性,unittest 内置了很多装饰器。

常用的 4 个装饰器如下:

unittest.skip(reason):跳过测试用例或者测试类

unittest.skipIf(condition,reason):如果第一个参数为 true,就跳过执行

unittest.skipUnless(condition,reason):如果第一个参数为 true,就执行测试用例或者测试类

unittest.expetedFailure():将测试案例结果设定为失败,无论执行结果是否失败

5. 实战

以 unittest 结合 Selenium 完成一个自动化测试实战。

第 1 步,自定义一个类继承于 TestCase

import unittest

class TestBaidu(unittest.TestCase):
    # 编写测试案例及Fixture
    pass

第 2 步,编写 Fixtrue

重写 setUpClass() 方法内实例化 WebDriver,tearDownClass() 方法内部释放资源

driver = None

@classmethod
def setUpClass(cls):
    # 实例化 WebDriver
    cls.driver = webdriver.Chrome()
    cls.base_url = 'http://www.baidu.com'

@classmethod
def tearDownClass(cls):
    # 释放资源
    cls.driver.quit()

第 3 步,编写测试案例,比如打开 Google

def test_open_google(self):
    # 打开Google
    self.driver.get('https://www.google.com')

    # 断言,判断标题
    self.assertEqual(self.driver.title, "Google")

第 4 步,运行测试案例

if __name__ == '__main__':
    unittest.main()

如此,就结合 Selenium + unittest,完成了 Web 端的自动化测试

喜欢本教程系列的同学

欢迎长按下图订阅!

⬇⬇⬇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值