测试之旅Ⅱ-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为开头的用例通过测试套件组合在一起。最后通过测试运行器运行测试用例。结果如下:
测试之旅Ⅱ-UnitTest测试框架
事实证明程序运行结果与预估一致。
可以发现测试结果并不直观,将代码改成如下:

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())

测试之旅Ⅱ-UnitTest测试框架
其中HTMLTestRunner模块下载地址,若使其兼容python3需做一些更改,本处不作赘述。