测试之旅Ⅱ-UnitTest测试框架
UnitTest测试框架
UnitTest模块是Python标准库中的模块,其模块提供了许多类和方法处理各种测试工作。
几个概念
- testcase 测试用例。
- testfixture 测试固件。固定的测试代码,通过setup()进行初始化,通过teardown()来结束测试工作。
- testsuite 测试套件。测试套件把多个测试用例集合到一起。
- testrunner 测试运行器。给测试用例提供运行环境。通过run()方法执行。
常用断言
- assertEqual(预期值,实际值) 当两者相等的时候测试通过。
- assertNotEqual(预期值,实际值) 当两者不相等的时候测试通过。
- assertTrue(表达式) 当表达式为真的时候测试通过。
- assertFalse(表达式) 当表达式为假的时候测试通过。
热身运动
先用PHP写一个简单的后台接口,判断当用户名等于nicerWu或wuxiaofan时,接口返回成功,其余情况接口返回失败。
<?php
$username = $_POST['username'];
if($username == 'nicerWu' || $username == 'wuxiaofan')
{
echo "成功";
}
else
{
echo "失败";
}
?>
Python测试代码
import unittest
import requests
class TestLogin(unittest.TestCase):
def setUp(self):
self.url = "http://localhost:8080/testing/dologin.php"
def testlogin1(self):
form = {'username': 'nicerWu'}
res = requests.post(self.url, data= form)
self.assertEqual(res.text,"成功")
def testlogin2(self):
form = {'username': 'hello'}
res = requests.post(self.url, data= form)
self.assertEqual(res.text,"成功")
def testlogin3(self):
form = {'username': 'wuxiaofan'}
res = requests.post(self.url, data= form)
self.assertEqual(res.text,"成功")
def suite():
loginTestCase = unittest.makeSuite(TestLogin, "test")
return loginTestCase
runner = unittest.TextTestRunner()
runner.run(suite())
前两行引入unittest模块和requests模块,分别为了框架测试和请求接口。然后生成TestLogin类并继承unittest.TestCase,在类中首先通过测试固件初始化变量url以减少代码量,便于维护。后面构建三个测试用例,分别向接口发出nicerWu、hello、wuxiaofan三个信息的post请求,由接口可知第一个与第三个测试用例将会返回成功,而第三个测试用例将会返回失败。在suite方法中将TestLogin类中的以test为开头的用例通过测试套件组合在一起。最后通过测试运行器运行测试用例。结果如下:
事实证明程序运行结果与预估一致。
可以发现测试结果并不直观,将代码改成如下:
import unittest
import requests
import HTMLTestRunner
class TestLogin(unittest.TestCase):
def setUp(self):
self.url = "http://localhost:8080/testing/dologin.php"
def testlogin1(self):
form = {'username': 'nicerWu'}
res = requests.post(self.url, data= form)
self.assertEqual(res.text,"成功")
def testlogin2(self):
form = {'username': 'hello'}
res = requests.post(self.url, data= form)
self.assertEqual(res.text,"成功")
def testlogin3(self):
form = {'username': 'wuxiaofan'}
res = requests.post(self.url, data= form)
self.assertEqual(res.text,"成功")
def suite():
loginTestCase = unittest.makeSuite(TestLogin, "test")
return loginTestCase
f = open("res1.html", "wb")
runner = HTMLTestRunner.HTMLTestRunner(stream = f, title = "测试报告", description = "详情")
runner.run(suite())
其中HTMLTestRunner模块下载地址,若使其兼容python3需做一些更改,本处不作赘述。