Unittest使用

本文介绍了Python的unittest框架,包括如何创建测试用例,使用setUp和tearDown设置前置和后置操作,以及测试用例的收集方法。此外,还讲解了TestSuite和TestRunner的使用,断言方法,以及ddt库进行数据驱动测试的实践。
摘要由CSDN通过智能技术生成

1、TestCase

  • 创建文件,文件名最好以test开头
  • 创建测试用例类,类名用Test开头
  • 在类里写测试用例 ,用例名以test_开头
import unittest

class TestDemo(unittest.TestCase):
    #写测试用例
    def test_01_login(self):
        print("------这是一条测试登陆的用例------")
        #下面写测试的逻辑

    def test_02_register(self):
        print("------这是一条测试注册的用例------")
        #下面写测试的逻辑

 2、用例编写--用例前后置

  • setup:用例级别的前置

每个用例执行前都会先执行setup方法

import unittest

class TestDemo(unittest.TestCase):
    #写测试用例
    def test_01_login(self):
        print("------这是一条测试登陆的用例------")
        #下面写测试的逻辑

    def test_02_register(self):
        print("------这是一条测试注册的用例------")
        #下面写测试的逻辑

    def setup(self):
        print("------用例执行前的前置方法------")
        #写用例执行前需要做的操作
  • TearDown:用例级别的后置

每个用例执行结束后都会再执行TearDown方法

import unittest

class TestDemo(unittest.TestCase):
    #写测试用例
    def test_01_login(self):
        print("------这是一条测试登陆的用例------")
        #下面写测试的逻辑

    def test_02_register(self):
        print("------这是一条测试注册的用例------")
        #下面写测试的逻辑

    def tearDown(self):
        print("------用例执行后的后置方法------")
        #写用例执行结束后需要做的操作
  • setUpClass:测试类级别的前置

整个类执行之前执行的方法

import unittest

class TestDemo(unittest.TestCase):
    #写测试用例
    def test_01_login(self):
        print("------这是一条测试登陆的用例------")
        #下面写测试的逻辑

    def test_02_register(self):
        print("------这是一条测试注册的用例------")
        #下面写测试的逻辑

    @classmethod
    def setUpClass(cls):
        print("------测试类执行前的前置方法------")
        #写测试类执行前需要做的操作
  • TearDownClass;测试类级别的后置

整个类执行之后要执行的方法

import unittest

class TestDemo(unittest.TestCase):
    #写测试用例
    def test_01_login(self):
        print("------这是一条测试登陆的用例------")
        #下面写测试的逻辑

    def test_02_register(self):
        print("------这是一条测试注册的用例------")
        #下面写测试的逻辑

    @classmethod
    def tearDownClass(cls):
        print("------测试类执行后的后置方法------")
        #写测试类执行后需要做的操作

3、用例收集--TestSuite

方法一:通过类名加载用例

import unittest
from tests.test_01demo import TestDemo
from tests.test_02demo import TestDemo2

#创建测试套件
suite = unittest.TestSuite()

#创建用例加载器
loader = unittest.TestLoader()

suite.addTest(loader.loadTestFromTestCase(TestDemo))
suite.addTest(loader.loadTestFromTestCase(TestDemo2))

#获取套件中的用例数量
print(suite.countTestCases())


方法二:通过用例模块加载用例

import unittest
from tests import test_01demo,test_02demo

#创建测试套件
suite = unittest.TestSuite()

#创建用例加载器
loader = unittest.TestLoader()

suite.addTest(loader.loadTestFromMoudle(test_01demo))
suite.addTest(loader.loadTestFromMoudle(test_02demo))

#获取套件中的用例数量
print(suite.countTestCases())


方法三:通过用例文件所在路径加载用例

import unittest

#创建测试套件
suite = unittest.TestSuite()

#创建用例加载器
loader = unittest.TestLoader()

suite.addTest(loader.discover(r'C:\project\unittestDemo\demo1'))
#默认是加载test开头的文件


#获取套件中的用例数量
print(suite.countTestCases())


默认加载器

import unittest

suite = unittest.defaultTestloader.discover(r'C:\project\unittestDemo\demo1')


#获取套件中的用例数量
print(suite.countTestCases())


4、用例运行--TestRunner

import unittest

#创建测试套件
suite = unittest.TestSuite()

#创建用例加载器
loader = unittest.TestLoader()

suite.addTest(loader.discover(r'C:\project\unittestDemo\demo1'))
#默认是加载test开头的文件


#用例运行
runner = unittest.TextTestRunner().   #参数查一下
runner.run(suite)


import unittest
from BeautifulReport import BeautifulReport
#此包需要安装

suite = unittest.defaultTestloader.discover(r'C:\project\unittestDemo\demo1')


#用例运行
runner = BeautifulReport(suites = suite)
runner.report(description='测试用例演示')


5、其他

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

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


调用 assertEqual() 来检查预期的输出; 调用 assertTrue() 或 assertFalse() 来验证一个条件;调用 assertRaises() 来验证抛出了一个特定的异常。

unittest 模块可以通过命令行运行模块、类和独立测试方法的测试:

python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
python -m unittest tests/test_something.py

-v 显示详细信息

-k 通配符匹配来查找测试用例

跳过测试

  • 无条件:@unittest.skip(reason)
  • 有条件:
    • @unittest.skipIf(conditionreason) 当 condition 为真时,跳过被装饰的测试。
    • @unittest.skipUnless(conditionreason) 当 condition 为假时,跳过被装饰的测试。

6、断言

        断言(assertion)是一种程序中的检查机制,用于确认某个条件是否为真。在代码中,断言通常用于测试和调试,帮助开发人员验证预期结果是否符合实际情况。

        断言语句通常采用如下形式:

        assert <condition>, <message>

        其中 <condition> 是一个布尔表达式或条件,用于判断是否满足某个条件。如果断言条件为假(False),则会引发 AssertionError 异常。 <message> 是可选的,用于指定当断言失败时显示的错误信息。

 assertEqual(first, second, msg=None)

测试 first 和 second 是否相等。 如果两个值的比较结果是不相等,则测试将失败

assertTrue(expr, msg=None)

assertFalse(expr, msg=None)

测试 expr 是否为真值(或假值)。

请注意这等价于 bool(expr) is True 不等价于 expr is True (后者要使用 assertIs(expr, True))。 当存在更专门的方法时也应避免使用此方法 (例如应使用 assertEqual(a, b) 而不是 assertTrue(a == b)),因为它们在测试失败时会提供更有用的错误消息。

7、unittest里的ddt数据驱动

ddt所有的实战都是通过装饰器的方式来调用的

@ddt   类装饰器,申明当前类使用ddt数据驱动

@data   函数装饰器,给测试用例传递参数

测试用例的执行次数取决于@data传参的个数,传n个值测试用例运行n次。

import unittest

@ddt
class TestMethods(unittest.TestCase):

    @data('北京','欢迎','您')
    def test_01_login(self,args):
        print(args)

@unpack 函数装饰器,将传输的数据解包,针对的是元组、列表、字典。

  •  对于元组和列表:解包之后有n个值,就必须使用n个变量来接收
  • 对于字典:解包之后字典的key是什么,就必须用其key作为参数名来接收
# 未解包
import unittest

@ddt
class TestMethods(unittest.TestCase):

    @data(['北京','欢迎'],['您','!'])
    def test_01_login(self,args):
        print(args)

# 会输出:
['北京','欢迎']
['您','!']
# 针对元组、列表
import unittest

@ddt
class TestMethods(unittest.TestCase):

    @data(['北京','欢迎'],['您','!'])
    @unpack
    def test_01_login(self,args1,args2):
        print(args1,args2)

# 会输出:
北京 欢迎
您 ! 
# 针对字典
import unittest

@ddt
class TestMethods(unittest.TestCase):

    @data({"country":"中国","capital","北京"},{"country":"英国","capital","伦敦"})
    @unpack
    def test_01_login(self,country,capital):
        print(country,capital)

# 会输出:
中国 北京
英国 伦敦

@file_data 函数装饰器,直接读取json或者yaml文件

yaml文件:  列表用'-'表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值