unittest_断言
既然测试用例都已经准备好了,那么我们该如何判断测试用例实际输出结果与我们的预期结果是否一致呢?
这时候就可以使用到断言来判断,两者是否一致,来完成自动化最后一步骤,查验结果
unittest单元测试中也提供了断言的方式,通过断言判断结果是否符合预期结果
unittest常用断言
unittest框架的TestCase类提供以下方法用于测试结果的判断
方法 | 检查 | 解释 |
assertEqual(a, b) | a ==b | 验证a=b,不等则fail |
assertNotEqual(a, b) | a !=b | 验证a != b,相等则fail |
assertTrue(x) | bool(x) is True | 验证x是true,如果为false,则fail |
assertFalse(x) | Bool(x) is False | 验证x是false,如果为true,则fail |
assertIs(a, b) | a is b | 验证a、b是同一个对象,不是则fail |
assertIsNot(a, b) | a is not b | 验证a、b不是同一个对象,是同一个则fail |
assertIsNone(x) | x is None | 验证x是None,不是则fail |
assertIsNotNone(x) | x is not None | 验证x不是None,不是则fail |
assertIn(a, b) | a in b | 验证a包含在b中,不包含则fail |
assertNotIn(a, b) | a not in b | 验证a不包含在b中,包含则fail |
assertIsInstance(a, b) | isinstance(a,b) | 验证a是b的实例,不是则fail |
assertNotIsInstance(a, b) | not isinstance(a,b) | 验证a不是b的实例,不是则fail |
断言例子
如何进行断言,可以见以下代码
import unittest class assert_test(unittest.TestCase): def test_01(self): 'a是否等于b(变量值上的是否相等)' a = 1 b = 1 self.assertEqual(a,b) def test_02(self): 's1是否在s2中' s1 = '好' s2 = '天气真好' self.assertIn(s1,s2) def test_03(self): 's1是否不在s2中' s1 = '对' s2 = '天气真好' self.assertNotIn(s1,s2) def test_04(self): '判断c和d变量引用对象是否为同一个' c = 5 d = 3 self.assertIs(c,d) if __name__ == '__main__': unittest.main()
查看输出,以上4个测试用例,前3个用例都通过,最后个用例 判断c和d变量引用对象是否为同一个,明显不是同一个对象,所以抛出错误,此用例失败
python抛出的错误信息可能没有那么直观 简单易懂。unittest断言中也提供了msg的参数,让我们来设置报错信息
def test_04(self): '判断c和d变量引用对象是否为同一个' c = 5 d = 3 self.assertIs(c,d,msg='变量c和变量d引用对象不是同一个')
可以看到msg自定义的信息也一同被输出,输出如下
以上就是断言的基本用法,那么接下来可以做一些接口测试中断言的实际用法,需要requests+unittest这两个python来实现
挑选了一个天气接口文档:https://www.juhe.cn/docs/api/id/73(聚合数据的天气接口,需要注册才能每天免费调用30次)
可以从接口文档中,看到该天气接口的所有信息,例如返回格式json,请求方式http get/post等等,那么可以直接来动手写,写个测试用例,然后使用断言判断请求的城市和json返回的城市是否是一致的
import unittest import requests class weather_test(unittest.TestCase): def test_01(self): # 接口地址 url = 'http://apis.juhe.cn/simpleWeather/query' #请求参数,以dict形式 data = { 'city':'上海', 'key':'8f0ef042853bf0bebd96664058c80bb7' } #实例化request对象,post请求 r = requests.post(url=url,data=data) #获取返回结果 result = r.text #进行断言 self.assertIn('上海',result) print('test1通过') def test_02(self): # 接口地址 url = 'http://apis.juhe.cn/simpleWeather/query' # 请求参数,以dict形式 data = { 'city': '北京', 'key': '8f0ef042853bf0bebd96664058c80bb7' } # 实例化request对象,post请求 r = requests.post(url=url, data=data) # 获取返回结果 result = r.text # 进行断言 self.assertIn('上海', result,msg='返回的城市不是上海') if __name__ == '__main__': unittest.main(verbosity=2)
输出结果如下:
可以看到第一个测试用例test_01,查询的是上海的天气,然后断言判断上海字段是否在返回结果当中,可以看到轻松通过
第二个测试用例test_02,查询的是北京的天气,断言判断上海字段是否在返回结果当中,断言抛出错误