全网最新最全的unittest单元测试的定义_单元测试定义(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

方法检查
assertEqual(a, b,msg=None)a ==b
assertNotEqual(a, b)a !=b
assertTrue(x)bool(x) is True
assertFalse(x)Bool(x) is False
assertIs(a, b)a is b
assertIsNot(a, b)a is not b
assertIsNone(x)x is None
assertIsNotNone(x)x is not None
assertIn(a, b)a in b
assertNotIn(a, b)a not in b
assertIsInstance(a, b)isinstance(a,b)
assertNotIsInstance(a, b)not isinstance(a,b)

​ 如果断言失败即不通过就会抛出一个AssertionError断言错误,成功则标识为通过,以上几种方式都有一个共同点,就是都有一个msg参数(表中只列了一个,其实都有),默认是None,即msg = None,如果指定msg参数的值,则将该信息作为失败的错误信息返回。

TestCase测试用例

编写测试用例前,我们需要建一个测试类继承unittest里面的TestCase类,继承这个类之后我们才是真正的使用unittest框架去写测试用例,编写测试用例的步骤如下:

  • 导入unittest模块
  • 创建一个测试类,并继承unittest.TestCase()
  • 定义测试方法,方法名必须以test_开头
  • 调用unittest.main()方法来运行测试用例,unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行

下面以注册功能为例,这个register.py就是注册功能的代码,没有前端界面,功能比较简单,只是方便用于演示,直接导入就可以使用。

python

register.py

users = [{‘username’: ‘test’, ‘password’: ‘123456’}]

def register(username, password1, password2):

if not all([username, password1, password2]):
return {“code”: 0, “msg”: “所有参数不能为空”}

注册功能

for user in users:
if username == user[‘username’]:
return {“code”: 0, “msg”: “该用户名已存在!”}
else:
if password1 != password2:
return {“code”: 0, “msg”: “两次密码输入不一致!”}
else:
if 6 <= len(username) >= 6 and 6 <= len(password1) <= 18:
users.append({‘username’: username, ‘password’: password2})
return {“code”: 1, “msg”: “注册成功”}
else:
return {“code”: 0, “msg”: “用户名和密码必须在6-18位之间”}

​ 下面是编写测试用例例子:

python

test_register.py

import unittest
from register import register # 导入被测试的代码

class TestRegister(unittest.TestCase):
“”“注册接口测试用例类”“”

def test_register_success(self):
“”“注册成功”“”
data = (“mikitest”, “miki123”, “miki123”) # 测试数据
expected = {“code”: 1, “msg”: “注册成功”} # 预期结果
result = register(*data) # 把测试数据传到被测的代码,接收实际结果
self.assertEqual(expected, result) # 断言,预期和实际是否一致,一致即用例通过

def test_username_isnull(self):
“”“注册失败-用户名为空”“”
data = (“”, “miki123”, “miki123”)
expected = {“code”: 0, “msg”: “所有参数不能为空”}
result = register(*data)
self.assertEqual(expected, result)

def test_username_lt6(self):
“”“注册失败-用户名大于18位”“”
data = (“mikitestmikitestmikitest”, “miki123”, “miki123”)
expected = {“code”: 0, “msg”: “用户名和密码必须在6-18位之间!”}
result = register(*data)
self.assertEqual(expected, result) # 这条用例应该是不通过的,注册代码bug

def test_pwd1_not_pwd2(self):
“”“注册失败-两次密码不一致”“”
data = (“miki123”, “test123”, “test321”)
expected = {“code”: 0, “msg”: “两次密码输入不一致!”}
result = register(*data)
self.assertEqual(expected, result)

如果直接运行这个文件,需要使用unittest中的main函数来执行测试用例

if name == ‘main’:
unittest.main()

​ 上面传递测试数据处用到一个*解包,我在python基础中有讲过解包的原理和例子,不明白的可以往回翻看一下,传送门:python基础(十) - 函数的定义及用法 - miki_peng - 博客园

​ 测试用例运行结果如下,一共4条用例,其中通过3条,不通过1条,不通过的是本身注册代码的bug。

shell

Testing started at 21:58 …
C:\software\python\python.exe “C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pycharm_jb_unittest_runner.py” --target test_register.TestRegister
Launching unittests with arguments python -m unittest test_register.TestRegister in D:\learn\python_test

{‘code’: 1, ‘msg’: ‘注册成功!’} != {‘code’: 0, ‘msg’: ‘用户名和密码必须在6-18位之间!’}

Expected :{‘code’: 0, ‘msg’: ‘用户名和密码必须在6-18位之间!’}
Actual :{‘code’: 1, ‘msg’: ‘注册成功!’}

Traceback (most recent call last):
File “C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pycharm\teamcity\diff_tools.py”, line 32, in _patched_equals
old(self, first, second, msg)
File “C:\software\python\lib\unittest\case.py”, line 839, in assertEqual
assertion_func(first, second, msg=msg)
File “C:\software\python\lib\unittest\case.py”, line 1138, in assertDictEqual
self.fail(self._formatMessage(msg, standardMsg))
File “C:\software\python\lib\unittest\case.py”, line 680, in fail
raise self.failureException(msg)
AssertionError: {‘code’: 0, ‘msg’: ‘用户名和密码必须在6-18位之间!’} != {‘code’: 1, ‘msg’: ‘注册成功!’}

  • {‘code’: 0, ‘msg’: ‘用户名和密码必须在6-18位之间!’}
  • {‘code’: 1, ‘msg’: ‘注册成功!’}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “C:\software\python\lib\unittest\case.py”, line 59, in testPartExecutor
yield
File “C:\software\python\lib\unittest\case.py”, line 615, in run
testMethod()
File “D:\learn\python24\python_base\day13_task\test_register.py”, line 36, in test_username_lt6
self.assertEqual(expected, result)

Ran 4 tests in 0.007s

FAILED (failures=1)

Process finished with exit code 1

Assertion failed

TestFixure测试夹具

​ unittest的测试夹具有两种使用方式,一种是以测试方法为维度的setUp()tearDown(),一种是以测试类为维度的setUpClass()tearDownClass()。以注册功能为例,但这个注册代码比较简单,没有真正需要用到测试夹具的地方,因此这只是个用法演示。

python

test_register.py

import unittest
from register import register # 导入被测试的代码

class TestRegister(unittest.TestCase):
“”“注册接口测试用例类”“”

def setUp(self):

每条用例执行之前都会执行

print(“用例{}开始执行–”.format(self))

def tearDown(self):

每条用例执行之后都会执行

print(“用例{}执行结束–”.format(self))

@classmethod # 指明这是个类方法以类为维度去执行的
def setUpClass(cls):

整个测试用例类中的用例执行之前,会先执行此方法

print(“-----setup—class-----”)

@classmethod
def tearDownClass(cls):

整个测试用例类中的用例执行完之后,会执行此方法

print(“-----teardown—class-----”)

def test_register_success(self):
“”“注册成功”“”
data = (“mikitest”, “miki123”, “miki123”) # 测试数据
expected = {“code”: 1, “msg”: “注册成功!”} # 预期结果
result = register(*data) # 把测试数据传到被测的代码,接收实际结果
self.assertEqual(expected, result) # 断言,预期和实际是否一致,一致即用例通过

def test_username_isnull(self):
“”“注册失败-用户名为空”“”
data = (“”, “miki123”, “miki123”)
expected = {“code”: 0, “msg”: “所有参数不能为空!”}
result = register(*data)
self.assertEqual(expected, result)

如果直接运行这个文件,需要使用unittest中的main函数来执行测试用例

if name == ‘main’:
unittest.main()

​ 运行结果:

shell

Testing started at 22:19 …
C:\software\python\python.exe “C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pycharm_jb_unittest_runner.py” --path D:/learn/python/test_register.py
Launching unittests with arguments python -m unittest D:/learn/python/test_register.py in D:\learn\python
-----setup—class-----用例test_pwd1_not_pwd2 (test_register.RegisterTestCase)开始执行–
用例test_pwd1_not_pwd2 (test_register.RegisterTestCase)执行结束–
用例test_register_success (test_register.RegisterTestCase)开始执行–
用例test_register_success (test_register.RegisterTestCase)执行结束–
用例test_username_isnull (test_register.RegisterTestCase)开始执行–
用例test_username_isnull (test_register.RegisterTestCase)执行结束–
用例test_username_lt6 (test_register.RegisterTestCase)开始执行–
用例test_username_lt6 (test_register.RegisterTestCase)执行结束–
-----teardown—class-----

Ran 4 tests in 0.003s

OK

Process finished with exit code 0

TestSuite测试套件

​ unittest.TestSuite()类来表示一个测试用例集,把需要执行的用例类或模块存到一起,常用的方法如下:

  • 🍊 unittest.TestSuite()
  • addTest():添加单个测试用例方法
  • addTest([..]):添加多个测试用例方法,方法名存在一个列表
  • 🍊 unittest.TestLoader()
  • loadTestsFromTestCase(测试类名):添加一个测试类
  • loadTestsFromModule(模块名):添加一个模块
  • discover(测试用例的所在目录):指定目录去加载,会自动寻找这个目录下所有符合命名规则的测试用例

python

run_test.py,与test_register.py、register.py同一目录下

import unittest
import test_register

第一步,创建一个测试套件

suite = unittest.TestSuite()

第二步:将测试用例,加载到测试套件中

方式1,添加单条测试用例

case = test_register.TestRegister(“test_register_success”) # 创建一个用例对象,注意:通过用例类去创建测试用例对象的时候,需要传入用例的方法名(字符串类型)

suite.addTest(case) # 添加用例到测试套件中

方式2,添加多条测试用例

case1 = test_register.TestRegister(“test_register_success”)

case2 = test_register.TestRegister(“test_username_isnull”)

suite.addTest([case1, case2]) # 添加用例到测试套件中

方式3,添加一个测试用例类

loader = unittest.TestLoader() # 创建一个加载对象

suite.addTest(loader.loadTestsFromTestCase(test_register.TestRegister))

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
t(loader.loadTestsFromTestCase(test_register.TestRegister))

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-V3d6sYrL-1713463531975)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值