单元测试:不仅用于程序测试,同样可适用于UI自动化测试(Selenium)、接口自动化测试(requests)、移动APP测试(Appium)。
1、写一个简单计算器caculator.py:
class calculator:
def __init__(self, a, b):
self.a = int(a)
self.b = int(b)
def add(self):
return self.a + self.b
def sub(self):
return self.a - self.b
def mul(self):
return self.a * self.b
def div(self):
return self.a / self.b
2、测试用例:
其中,
setUp:用例的前置条件,相当于初始化
tearDown:用例执行完之后的动作
unittest每个方法前面要加test_
在主程序中,新建一个测试套件suite,使用addTest方法新增测试用例。最后,创建runner对象,运行测试套件。
import unittest
from calculator import calculator
class ModuleTest(unittest.TestCase):
def setUp(self):
self.cal = calculator(8,4)
def tearDown(self):
pass
def test_add(self):
result = self.cal.add()
self.assertEqual(result, 12)
def test_sub(self):
result = self.cal.sub()
self.assertEqual(result, 4)
def test_mul(self):
result = self.cal.mul()
self.assertEqual(result, 32)
def test_div(self):
result = self.cal.div()
self.assertEqual(result, 3)
if __name__=="__main__":
suite = unittest.TestSuite()
suite.addTest(ModuleTest("test_add"))
suite.addTest(ModuleTest("test_sub"))
suite.addTest(ModuleTest("test_mul"))
suite.addTest(ModuleTest("test_div"))
runner = unittest.TextTestRunner()
runner.run(suite)
Django自带的单元测试类django.test.TestCase继承自unittest.TestCase。
每个应用下面都有一个tests.py测试文件。
下面是测试上一节编写的,签到系统功能。
使用302是因为登录后会跳转even_mange/
class LoginActionTest(TestCase):
def setUp(self):
user = User.objects.get(username="admin")
self.assertEqual(user.username, 'admin')
self.assertEqual(user.email, '[email protected]')
def test_login_action_username_password_null(self):
'''用户名密码为空'''
test_data = {'username': '', 'password': ''}
response = self.client.post('/login_action/', data=test_data)
self.assertEqual(response.status_code, 200)
self.assertEqual(b"username or password error!", response.content)
def test_login_action_username_password_error(self):
'''用户名密码错误'''
test_data = {'username': 'asdasda', 'password': 'asdasdadaads'}
response = self.client.post('/login_action/', data=test_data)
self.assertEqual(response.status_code, 200)
self.assertEqual(b"username or password error!", response.content)
def test_login_action_success(self):
test_data = {'username': 'admin', 'password': 'admin'}
response = self.client.post('/login_action/', data = test_data)
self.assertEqual(response.status_code, 302)