嗯,没错配图就是这么敷衍,连找张像样的图片我都不愿意,最近在测试,各种测试用的方法和工具比较多,所以今天总结一下python脚本测试你的API:
首先我们创建一个test.py
我们要使用unittest这个库来进行单元测试(就像php的phpunit)
我们创建一个类TestApi,话不多说上代码:
#!/usr/bin/python
# coding=utf-8
import requests, unittest, HTMLTestRunner, test, random, sys
reload(sys)
class TestPupupulaApi(unittest.TestCase):
def setUp(self):
url = '#############################'
def testSms(self):
params = {
"phone": "185####8986",
}
url = "############################"
r = requests.get(url, params=params, headers=test.header)
print(r.content)
self.assertEqual(r.status_code, 200)
def testLogin(self):
data = {
"phone": '185XXXX8986',
"code": "######",
}
url = "##############################"
r = requests.post(url, data=data, headers=test.header)
print(r)
self.assertEqual(r.status_code, 200)
def tearDown(self):
pass
ok,这是我针对get和post分别给的eg。
先看一下引入的包,requests是必需的,因为我们测试的是API的请求,unittest也是必需的我们需要依赖这个库来进行单元测试,HTMLTestRunner这是为了给unittest生成html文件的,你可以在进行完单元测试后直接生成html报告,做法如下:
if __name__ == '__main__':
report_dir = r'#####Test.html'
re_open = open(report_dir, 'wb')
suite = unittest.TestLoader().loadTestsFromTestCase(TestPupupulaApi)
runner = HTMLTestRunner.HTMLTestRunner(
stream=re_open,
title=unicode('XXXXX测试报告', encoding='utf-8'),
description=unicode('XXXX接口单元测试报告', encoding='utf-8')
)
runner.run(suite)
这个库在py2.7好像安装不ok,我们需要手动的下载这个文件,然后把它放在我们的venv/lib/python2.7/site-packages中,然后直接import HTMLTestRunner就可以愉快的使用啦。
嗯,test这个库是我自己引入的,忽略不计,random是为了生成随机的数据或字符串,没有这段代码体现,直接忽略,然后我们sys是为了规定默认的编码,sys.setdefaultcharacter(),你也可以直接就在文件的顶端引入
# coding=utf-8
嗯,这是大概的使用,但是我们的重点不是这个,虽然都是测试,但是怎么才能称为比较合理有效的测试,是我们作为工程师应该多想的,不要因为这是你自己的代码,就舍不得蹂躏,所以这个时候写断言的部分就需要水平了,我这里给出的是最简单的一个判断,就是我只要请求的返回是200,我就断言这个请求成功了,其实在我们实际的业务中,这样是远远不够的,其实作为后端你和移动端的交互,不仅仅是200就可以满足的,还要看一下有没有按照你们之前的接口协议,返回相应的数据格式,必要的你都需要判断,我们来看一下python的assert有哪些使用方法:
先mark一下,明天详细总结!
比较常用的:
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 2.7
assertIsNot(a, b) a is not b 2.7
assertIsNone(x) x is None 2.7
assertIsNotNone(x) x is not None 2.7
assertIn(a, b) a in b 2.7
assertNotIn(a, b) a not in b 2.7
assertIsInstance(a, b) isinstance(a, b) 2.7
assertNotIsInstance(a, b) not isinstance(a, b) 2.7
assertAlmostEqual(a, b) round(a-b, 7) == 0
assertNotAlmostEqual(a, b) round(a-b, 7) != 0
assertGreater(a, b) a > b 2.7
assertGreaterEqual(a, b) a >= b 2.7
assertLess(a, b) a < b 2.7
assertLessEqual(a, b) a <= b 2.7
assertRegexpMatches(s, re) regex.search(s) 2.7
assertNotRegexpMatches(s, re) not regex.search(s) 2.7
assertItemsEqual(a, b) sorted(a) == sorted(b) and works with unhashable objs 2.7
assertDictContainsSubset(a, b) all the key/value pairs in a exist in b 2.7
assertMultiLineEqual(a, b) strings 2.7
assertSequenceEqual(a, b) sequences 2.7
assertListEqual(a, b) lists 2.7
assertTupleEqual(a, b) tuples 2.7
assertSetEqual(a, b) sets or frozensets 2.7
assertDictEqual(a, b) dicts 2.7
assertMultiLineEqual(a, b) strings 2.7
assertSequenceEqual(a, b) sequences 2.7
assertListEqual(a, b) lists 2.7
assertTupleEqual(a, b) tuples 2.7
assertSetEqual(a, b) sets or frozensets 2.7
assertDictEqual(a, b) dicts 2.7
要想把单元测试写的有水平还是需要一点点能力的,如果你想做这样的人,就好好熟悉一下吧,最近心情很down,不想说话,感觉好累。。
周六会继续总结Redis,生产者和消费者的几种模式实现(涉及一点点小小的架构),来一首歌,enjoy the fucking day!