python自动化接口测试之unittest初探

一,什么是unittest

Unittest是Python内部自带的一个单元测试的模块,它设计的灵感来源于Junit,具有和Junit类似的结构,有过Junit经验的朋友可以很快上手。

二,unittest能干啥

Unittest具备完整的测试结构,支持自动化测试的执行,对测试用例集进行组织,并且提供了丰富的断言方法,最后生成测试报告。

Unittest框架的初衷是用于单元测试,但也不限于此,在实际工作中,由于它强大的功能,提供的完整的测试流程,我们往往将其用于自动化测试的各个方面,例如在本书中会讲到的接口测试实例都会用到Unittest。

三,unittest基本使用

实例

unittest 模块提供了一系列创建和运行测试的工具。这一段落演示了这些工具的一小部分,但也足以满足大部分用户的需求。
这是一段简短的代码,来测试一个add方法是否正确:

import unittest


# 没啥意义演示需要
def add(a, b):
    return a + b


# 继承 unittest.TestCase
class TestUnittestDemo(unittest.TestCase):

    def setUp(self):
        """每个test运行前都会执行此方法"""
        pass

    def tearDown(self):
        """每个test运行后都会执行的方法"""
        pass

    def test_assertEqual(self):
        """1+2=3"""
        # assertEqual(实际结果,预期结果) 检查实际结果是否等于预期结果
        self.assertEqual(add(1, 2), 3)

    def test_assertTrueFalse(self):
        """1+2=3,1+2!=2"""
        # assertTrue(True)检查结果是否为真
        self.assertTrue(add(1, 2) == 3)
        # assertFalse(False)检查结果是否为假
        self.assertFalse(add(1, 2) == 2)

    def test_TypeError(self):
        """add(a,b)b的类型错误"""
        a = 1
        b = "2"
        # 验证抛出特定异常:TypeError,如果没抛出异常则执行失败
        with self.assertRaises(TypeError):
            # 此句运行结果会抛出异常TypeError: unsupported operand type(s) for +: 'int' and 'str'
            add(a, b)


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

类继承 unittest.TestCase 就创建了一个测试样例。上述类中是三个独立的测试方法,这些方法的命名都以 test 开头。 这个命名约定是为了告诉unittest测试运行时,类中的哪些方法是要执行的测试用例。

每个测试用例设置的检查点:
assertEqual() 来检查预期的输出;
assertTrue() 或 assertFalse() 来验证一个条件;
assertRaises() 来验证抛出了一个特定的异常。
注:使用这些方法而不是 assert 语句是为了让测试运行者能聚合所有的测试结果并产生结果报告。

通过 setUp() 和 tearDown() 方法,可以设置测试开始前与完成后需要执行的指令。 后面对此有更为详细的描述。

最后的代码块中,演示了运行测试的简单方法。 unittest.main() 提供了一个运行测试脚本的命令行接口。
上面的代码运行输出:

...

Ran 3 tests in 0.005s

OK

断言

常用断言方法:

方法 检查 支持版本
assertEqual(a, b) 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 3.1
assertIsNot(a, b) a is not b 3.1
assertIsNone(x) x is None 3.1
assertIsNotNone(x) x is not None 3.1
assertIn(a, b) a in b 3.1
assertNotIn(a, b) a not in b 3.1
assertIsInstance(a, b) isinstance(a, b) 3.2
assertNotIsInstance(a, b) not isinstance(a, b) 3.2

assertEqual(first, second, msg=None)

测试第一和第二是否相等。如果值比较不相等,则测试将失败。

另外,如果first和second是完全相同的类型,并且将调用list,tuple,dict,set,frozenset或str或子类addTypeEqualityFunc()向特定类型的相等函数注册的任何类型中的一个,以便生成更有用的默认错误消息(另请参见类型特定方法的列表)。

assertNotEqual(first, second, msg=None)

测试第一和第二个不相等。如果这些值确实比较相等,则测试将失败。

assertTrue(expr, msg=None)

assertFalse(expr, msg=None)

测试expr为true(或false)。

请注意,这等效于而不是等效(用于后者)。当有更多特定的方法可用时(例如代替),也应避免使用此方法 ,因为在发生故障的情况下它们可以提供更好的错误消息。bool(expr) is Trueexpr is TrueassertIs(expr, True)assertEqual(a, b)assertTrue(a == b)

assertIs(first, second, msg=None)

assertIsNot(first, second, msg=None)

测试第一和第二评估(或不评估)对同一个对象。

3.1 新版功能.

assertIsNone(expr, msg=None)

assertIsNotNone(expr, msg=None)

测试expr是(或不是)None。

3.1 新版功能.

assertIn(first, second, msg=None)

assertNotIn(first, second, msg=None)

测试第二个是(不是)第一个。

3.1 新版功能.

assertIsInstance(obj, cls, msg=None)

assertNotIsInstance(obj, cls, msg=None)

测试obj是(或不是)cls的实例(可以是类或类的元组,如所支持isinstance())。要检查确切的类型,请使用。assertIs(type(obj), cls)
3.2 新版功能.

四,unittest接口测试实例

实例分好几个版本,难度从低到高循序渐进;如果觉得自己对unittest有一定基础,建议直接跳过前几个版本

初级版

import requests
import unittest


class Test(unittest.TestCase):
    """
    初级版:v1.0
    """
    def test_01(self):
        """正常登陆测试"""
        params = {
   
            "username": "正确的用户名",
            "password": "正确的密码",
        }
        api_url = "https://xxx/login"
        headers = {
   "Content-Type": "application/json;charset=UTF-8"}
        r = requests.post(url=api_url, params=params, headers=headers)
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.json()['code'], 0)
        self.assertEqual(r.json()['message'], "成功[OK]")

    def test_02(self):
        """username 错误"""
        params = {
   
            "username": "错误的密码",
            "password": "正确的密码",
        }
        api_url = "https://xxx/login"
        headers = {
   "Content-Type": "application/json;charset=UTF-8"}
        r = requests.post(url=api_url, params=params, headers=headers)
        self.assertEqual(r.status_code, 200
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值