在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo
1.unittest简单用法
# -*-coding:UTF:8-*-
import unittest
class TestMethod(unittest.TestCase): # 定义一个类,继承自unittest.TestCase
# 每次执行用例前执行setUp(),可以在这里做一些初始化的工作
def setUp(self):
print('setUp')
# 每次执行用例后执行tearDown
def tearDown(self):
print('tearDown')
def test001(self): # unittest中的用例必须以test开头
print('test001')
def test002(self):
print('test002')
if __name__ == '__main':
unittest.main()
运行结果如下:
如果不想在每次执行用例时都执行一遍setUp()和tearDown(),只要执行一次就好,可以使用类方法代替:加粗样式
# -*-coding:UTF:8-*-
import unittest
class TestMethod(unittest.TestCase): # 定义一个类,继承自unittest.TestCase
# 每次执行用例前执行setUp(),可以在这里做一些初始化的工作
@classmethod
def setUpClass(cls):
print('setUp\n')
# 每次执行用例后执行tearDown
@classmethod
def tearDownClass(cls):
print('tearDown')
def test001(self): # unittest中的用例必须以test开头
print('test001')
def test002(self):
print('test002')
if __name__ == '__main__':
unittest.main()
运行结果如下:
2.接口测试实例
# -*-coding:UTF:8-*-
import unittest
from interface.demo import RunMain # 从之前封装的文件中,引入RunMain类
import HTMLTestRunner
import json
# import warings
class TestMethod(unittest.TestCase): # 定义一个类,继承自unittest.TestCase
def setUp(self):
# warnings.simplefillter('ignore',ResourceWarbing) # 有告警时可以打开
self.run = RunMain() # 在初始化方法中实例化get/post基类,生成一个实例对象,这样就不需要在每个用例中再进行实例化了
def test01(self):
url = 'http://localhost:7001/XXX'
data = {
'controlSeq': '2018118325'
}
r = self.run.run_main(url, 'POST', data) # 调用RunMain类中run_main方法
print(r)
re = json.loads(r)
self.assertEqual(re['status'], '200', '测试失败')
#注意我在进行断言前,先用json库的json.loads()函数对上一步中的返回结果r进行了解码,不然直接调用r['status']时会报错“json.loadsstring indices must be integers”
#原因是,在之前的例子中,为了使显示效果更加直观,对服务器的响应结果利用json.dumps()进行了json格式的编码
def test02(self):
url = 'http://localhost:7001/XXX'
data = {
"controlSeq": "2018118325"
}
r = self.run.run_main(url, 'GET', data)
print(r)
re = json.loads(r)
self.assertEqual(re["status"], '200', '测试失败')
# @unittest.skip('test03') # 使用skip()方法表示跳过用例test03
def test03(self):
url = 'http://localhost:7001/XXX'
data = {
'controlSeq': '2018118361',
'seq': '2939',
'type': '1'
}
r = self.run.run_main(url, 'POST', data)
print(r)
# print(type(r)) # 查看返回对象r的类型
re = json.loads(r)
# print(type(re))
self.assertEqual(re['status'], '200', '测试失败')
if __name__ == "__main__":
unittest.main() #表示执行全部用例
3.使用TestSuite()来自定义执行case
# -*-coding:UTF:8-*-
import unittest
from interface.demo import RunMain # 从之前封装的文件中,引入RunMain类
import HTMLTestRunner
import json
class TestMethod(unittest.TestCase): # 定义一个类,继承自unittest.TestCase
def setUp(self):
self.run = RunMain() # 在初始化方法中实例化get/post基类,生成一个实例对象,这样就不需要在每个用例中再进行实例化了
def test01(self):
url = 'http://localhost:7001/XXX'
data = {
'controlSeq': '2018118325'
}
r = self.run.run_main(url, 'POST', data) # 调用RunMain类中run_main方法
print(r)
re = json.loads(r)
self.assertEqual(re['status'], '200', '测试失败')
# globals()['userid'] = 22 #定义全局变量
def test02(self):
# print(userid) #使用case1中的全局变量,执行时需要全部执行,不能只执行后面的,不然会报错
url = 'http://localhost:7001/XXX'
data = {
"controlSeq": "2018118325"
}
r = self.run.run_main(url, 'GET', data)
print(r)
re = json.loads(r)
self.assertEqual(re["status"], '200', '测试失败')
# @unittest.skip('test03') # 跳过用例test03
def test03(self):
url = 'http://localhost:7001/XXX'
data = {
'controlSeq': '2018118361',
'seq': '2939',
'type': '1'
}
r = self.run.run_main(url, 'POST', data)
print(r)
# print(type(r)) # 查看返回对象r的类型
re = json.loads(r)
# print(type(re)) #查看json对象解码后的类型
self.assertEqual(re['status'], '200', '测试失败')
if __name__ == "__main__":
suite = unittest.TestSuite() # 调用unittest的TestSuite(),理解为管理case的一个容器(测试套件)
suite.addTest(TestMethod('test01')) # 向测试套件中添加用例,"TestMethod"是上面定义的类名,"test01"是用例名
suite.addTest(TestMethod('test02'))
suite.addTest(TestMethod('test03'))
runner = unittest.TextTestRunner()
runner.run(suite) # 执行套件中的用例
此时再执行这个文件,就只会执行添加到测试套件中的case了
但是如果是使用的pycharm来运行脚本,则有几点需要注意,pycharm这里有个坑,困扰了我很久,在第三目中的小总结中说一下