<p>Python中有几个可用的单元测试框架。Try/except块对于错误处理很好,但是如果要对调用进行单元测试,仍然需要对调用进行单独的单元测试</p>
<p>您确实有一些可以测试的东西,您可以返回它并在单元测试中进行测试</p>
<p>使用unittest的单元测试示例:</p>
<pre><code>import unittest
import requests
class RestCalls():
def google_do_something(blahblah):
url= blahblah
try:
r = requests.get(url,timeout=1)
r.raise_for_status()
return r.status_code
except requests.exceptions.Timeout as errt:
print (errt)
raise
except requests.exceptions.HTTPError as errh:
print (errh)
raise
except requests.exceptions.ConnectionError as errc:
print (errc)
raise
except requests.exceptions.RequestException as err:
print (err)
raise
class TestRESTMethods(unittest.TestCase):
def test_valid_url(self):
self.assertEqual(200,RestCalls.google_do_something('http://www.google.com/search'))
def test_exception(self):
self.assertRaises(requests.exceptions.Timeout,RestCalls.google_do_something,'http://localhost:28989')
if __name__ == '__main__':
unittest.main()
</code></pre>
<p>执行时应显示(<em>对此帖子进行了一些编辑,更新后的输出包含在帖子底部</em>):</p>
<pre><code>> python .\Tests.py
.
Ran 1 test in 0.192s
OK
</code></pre>
<p>如果您声明了与请求不同的响应代码,它将失败(请求只是返回http响应代码):</p>
<pre><code>python .\Tests.py
F
======================================================================
FAIL: test_upper (__main__.TestStringMethods)
Traceback (most recent call last):
File ".\Tests.py", line 25, in test_upper
self.assertEqual(404,RestCalls.google_do_something('search'))
AssertionError: 404 != 200
Ran 1 test in 0.245s
FAILED (failures=1)
</code></pre>
<p>这是意料之中的</p>
<p>编辑:包括异常测试。您可以通过在except块中包含<strong>raise</strong>来测试这些,该块将在运行后显示:</p>
<pre><code>> python .\Tests.py
HTTPConnectionPool(host='localhost', port=28989): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x03688598>, 'Connection to localhost timed out. (connect timeout=1)'))
..
Ran 2 tests in 2.216s
OK
</code></pre>
<p>参考资料:</p>
<ul>
<li><a href="https://stackoverflow.com/questions/36647/unit-tests-in-python">Unit tests in Python</a></li>
<li><a href="https://docs.python.org/3/library/unittest.html" rel="nofollow noreferrer">https://docs.python.org/3/library/unittest.html</a></li>
<li><a href="https://en.wikipedia.org/wiki/List_of_HTTP_status_codes" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/List_of_HTTP_status_codes</a></li>
</ul>