首页 > 技术文章 > unittest相关内容

yuguog 2021-06-24 11:28 原文

unittest相关内容

一、什么是unittest

unittest是Python单元测试框架,类似于JUnit框架。

unittest中有4个重要的概念:test fixture, test case, test suite, test runner

Testcase:

一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

TestSuite:

多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

Test runner:

是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。

TestLoader:

是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

Test fixture:

对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。这个有什么用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。关于fixture,还有一个专门的库函数叫做fixtures,功能更加强大。

二、unittest模块的常用方法

1.判断结果是否相同

assertEqual(a, b) a == b

2.判断结果是否不相同

assertNotEqual(a, b) a != b

3.判断结果是否为ture

assertTrue(x) bool(x) is True

4.判断结果是否为false

assertFalse(x) bool(x) is False

5.判断结果a是否为b

assertIs(a, b) a is b

6.判断结果a是否不为b

assertIsNot(a, b) a is not b

7.判断结果是否为空

assertIsNone(x) x is None

8.判断结果是否不为空

assertIsNotNone(x) x is not None

9.判断结果是否在这些数据里

assertIn(a, b) a in b

10.判断结果是否不在这些数据里

assertNotIn(a, b) a not in b

11.判断a是否为b的一个实例

assertIsInstance(a, b) isinstance(a, b)

12.判断a是否不为b的一个实例

assertNotIsInstance(a, b) not isinstance(a, b)

 

 

登录接口测试

import requests
import unittest
import json
from parameterized import parameterized


# 1.使用requests去完成请求接口的任务
def yun_login(username, password):
url = "http://yun.zenm.vip/iot/account/login/"
header = {
"Content-Type": "application/json"
}
data = {
"username": username,
"password": password
}
json_data = json.dumps(data)
res = requests.post(url=url, data=json_data, headers=header)
return res.json()


# 2.为当前接口任务写测试用例
class YunLoginTest(unittest.TestCase):
@parameterized.expand([("peter", "admin", 200), ("peter", "123456", 4), ("peter1", "admin", 5)])
# 正确用例
def test_001(self, username, password, code):
# 获取requests请求以后的JSON数据
json_data = yun_login(username, password)
self.assertEqual(int(json_data['result']), code)
# # 错误密码用例
# def test_002(self):
# username = "peter"
# password = "123456"
# code = 4
# # 获取requests请求以后的JSON数据
# json_data = yun_login(username, password)
# self.assertEqual(int(json_data['result']), code)
# # 用户不存在的用例
# def test_003(self):
# username = "peter1"
# password = "admin"
# code = 5
# # 获取requests请求以后的JSON数据
# json_data = yun_login(username, password)
# self.assertEqual(int(json_data['result']), code)























unittest使用方法

 1.导入unittest包

 import unittest

2.编写测试类继承unittest.TestCase父类
class YunLoginTest(unittest.TestCase):
3.编写测试用例
    
import unittest,parameterized
def my_sum(a,b):
a += 1
b += 3
return a+b
# 生成测试用例
class TestSum(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("先执行类")
def setUp(self):
print("使用前执行")
def test_01(self):
print(my_sum(3,2))

def test_02(self):
print(my_sum(1,6))

def test_03(self):
print(my_sum(4,-3))

def test_04(self):
print(my_sum(0,3))
def tearDown(self):
print("方法结束后")
@classmethod
def tearDownClass(cls):
print("结束类用例")

class TestSum1(unittest.TestCase):
def test_01(self):
number = my_sum(3,4)
self.assertEqual(number,11)

def test_02(self):
number = my_sum(1, -3)
self.assertEqual(number, 2)

def test_03(self):
number = my_sum(3, 4)
self.assertIn(number, [5,6,7,8,9,10,11])

def test_04(self):
number = my_sum(7, 4)
self.assertIn(number, [1, 6, 7, 8, 9, 10])

# def setUpModule():
# print("11111")
#
# def tearDownModule():
# print('9999')
--------
# 另一种方法
# 调用时用类调用
class TestSum2(unittest.TestCase):
@parameterized.parameterized.expand([(1,5,10),(-1,8,11),(-2,-7,-5)])
def test_01(self,x,y,z):
number = my_sum(x,y)
self.assertEqual(number,z)

4.运行unittest测试框架
  
# 将测试用例添加到套件里面
suite = unittest.TestSuite()
suite.addTest(TestSum1("test_01"))
suite.addTest(TestSum1("test_02"))
suite.addTest(TestSum1("test_03"))
suite.addTest(TestSum1("test_04"))

# suite = unittest.TestSuite()
# suite.addTest(TestSum("test_01"))
# suite.addTest(TestSum("test_02"))
# suite.addTest(TestSum("test_03"))
# suite.addTest(TestSum("test_04"))

suite = unittest.TestSuite()
suite.addTest(TestSum1("test_01"))

# 一次性添加一个类里面的所有用例
# suite.addTest(unittest.makeSuite(TestSum2))

# 批量添加一个py文件里所有的用例
# suite = unittest.TestLoader().discover('./','test1.py')
#
# 执行suite对象中的用例
# runner = unittest.TextTestRunner()
# runner.run(suite)
#
# if __name__ == '__main__':
# TestSum()


4.unnittest常用断言

 

 5.配合HTMLTestRunner生成测试报告

# 将测试用例添加到套件里面
suite = unittest.TestSuite()
suite.addTest(TestSum1("test_01"))
suite.addTest(TestSum1("test_02"))
suite.addTest(TestSum1("test_03"))
suite.addTest(TestSum1("test_04"))
# 生成测试报告
f = open("test.html", 'wb')
runner = HTMLTestRunner(stream=f, title="自动化测试",
description="Chrome 浏览器")
runner.run(suite)

f.close()

推荐阅读