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
(condition, reason) 当 condition 为真时,跳过被装饰的测试。
@unittest.
skipUnless
(condition, reason) 当 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文件: 列表用'-'表示