1. 对于函数进行单元测试
calc.py
defadd(x, y):"""Add Function"""return x + y
defsubtract(x, y):"""Subtract Function"""return x - y
defmultiply(x, y):"""Multiply Function"""return x * y
defdivide(x, y):"""Divide Function"""if y ==0:raise ValueError('Can not divide by zero!')return x / y
test_calc.py
import unittest
import calc
classTestCalc(unittest.TestCase):deftest_add(self):
self.assertEqual(calc.add(10,5),15)
self.assertEqual(calc.add(-1,1),0)
self.assertEqual(calc.add(-1,-1),-2)deftest_subtract(self):
self.assertEqual(calc.subtract(10,5),5)
self.assertEqual(calc.subtract(-1,1),-2)
self.assertEqual(calc.subtract(-1,-1),0)deftest_multiply(self):
self.assertEqual(calc.multiply(10,5),50)
self.assertEqual(calc.multiply(-1,1),-1)
self.assertEqual(calc.multiply(-1,-1),1)deftest_divide(self):
self.assertEqual(calc.divide(10,5),2)
self.assertEqual(calc.divide(-1,1),-1)
self.assertEqual(calc.divide(-1,-1),1)
self.assertRaises(ValueError, calc.divide,10,0)if __name__ =='__main__':
unittest.main()
2. 对于对象(object)进行单元测试
employee.py
classEmployee:"""A sample Employee class"""
raise_amt =1.05def__init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
@propertydefemail(self):return'{}.{}@email.com'.format(self.first, self.last)@propertydeffullname(self):return'{} {}'.format(self.first, self.last)defapply_raise(self):
self.pay =int(self.pay * self.raise_amt)
test_employee.py
import unittest
from employee import Employee
classTestEmployee(unittest.TestCase):@classmethoddefsetUpClass(cls):print('setupClass')@classmethoddeftearDownClass(cls):print('teardownClass')defsetUp(self):print('setUp')
self.emp_1 = Employee('Elon','Musk',50000)
self.emp_2 = Employee('Sue','Smith',60000)deftearDown(self):print('tearDown\n')deftest_email(self):print('test_email')
self.assertEqual(self.emp_1.email,'[email protected]')
self.assertEqual(self.emp_2.email,'[email protected]')
self.emp_1.first ='John'
self.emp_2.first ='Jane'
self.assertEqual(self.emp_1.email,'[email protected]')
self.assertEqual(self.emp_2.email,'[email protected]')deftest_fullname(self):print('test_fullname')
self.assertEqual(self.emp_1.fullname,'Elon Musk')
self.assertEqual(self.emp_2.fullname,'Sue Smith')
self.emp_1.first ='John'
self.emp_2.first ='Jane'
self.assertEqual(self.emp_1.fullname,'John Musk')
self.assertEqual(self.emp_2.fullname,'Jane Smith')deftest_apply_raise(self):print('test_apply_raise')
self.emp_1.apply_raise()
self.emp_2.apply_raise()
self.assertEqual(self.emp_1.pay,52500)
self.assertEqual(self.emp_2.pay,63000)if __name__ =='__main__':
unittest.main()
输出为:
setupClass
setUp
test_apply_raise
tearDown
.setUp
test_email
tearDown
.setUp
test_fullname
tearDown
.teardownClass
Ran 3 tests in 0.001s
OK
3. 使用mock模拟对象库
employee.py
import requests
classEmployee:"""A sample Employee class"""
raise_amt =1.05def__init__(self, first, last, pay):
self.first = first
self.last = last
self.pay = pay
@propertydefemail(self):return'{}.{}@email.com'.format(self.first, self.last)@propertydeffullname(self):return'{} {}'.format(self.first, self.last)defapply_raise(self):
self.pay =int(self.pay * self.raise_amt)defmonthly_schedule(self, month):
response = requests.get(f'http://company.com/{self.last}/{month}')if response.ok:return response.text
else:return'Bad Response!'
test_employee.py
import unittest
from unittest.mock import patch
from employee import Employee
classTestEmployee(unittest.TestCase):@classmethoddefsetUpClass(cls):print('setupClass')@classmethoddeftearDownClass(cls):print('teardownClass')defsetUp(self):print('setUp')
self.emp_1 = Employee('Elon','Musk',50000)
self.emp_2 = Employee('Sue','Smith',60000)deftearDown(self):print('tearDown\n')# Test 1deftest_email(self):print('test_email')
self.assertEqual(self.emp_1.email,'[email protected]')
self.assertEqual(self.emp_2.email,'[email protected]')
self.emp_1.first ='John'
self.emp_2.first ='Jane'
self.assertEqual(self.emp_1.email,'[email protected]')
self.assertEqual(self.emp_2.email,'[email protected]')# Test 2deftest_fullname(self):print('test_fullname')
self.assertEqual(self.emp_1.fullname,'Elon Musk')
self.assertEqual(self.emp_2.fullname,'Sue Smith')
self.emp_1.first ='John'
self.emp_2.first ='Jane'
self.assertEqual(self.emp_1.fullname,'John Musk')
self.assertEqual(self.emp_2.fullname,'Jane Smith')# Test 3deftest_apply_raise(self):print('test_apply_raise')
self.emp_1.apply_raise()
self.emp_2.apply_raise()
self.assertEqual(self.emp_1.pay,52500)
self.assertEqual(self.emp_2.pay,63000)# Test 4deftest_monthly_schedule(self):# 模拟替换网络请求with patch('employee.requests.get')as mocked_get:
mocked_get.return_value.ok =True
mocked_get.return_value.text ='Success'
schedule = self.emp_1.monthly_schedule('May')
mocked_get.assert_called_with('http://company.com/Musk/May')
self.assertEqual(schedule,'Success')
mocked_get.return_value.ok =False
schedule = self.emp_2.monthly_schedule('June')
mocked_get.assert_called_with('http://company.com/Smith/June')
self.assertEqual(schedule,'Bad Response!')if __name__ =='__main__':
unittest.main()
输出为:
setupClass
setUp
test_apply_raise
tearDown
.setUp
test_email
tearDown
.setUp
test_fullname
tearDown
.setUp
tearDown
.teardownClass
Ran 4 tests in 0.001s
OK
4. 使用pytest进行测试
binarysearch.py,主要使用assert。
defbinary_search(array, target):ifnot array:return-1
begin, end =0,len(array)while begin < end:
mid = begin +(end - begin)//2if array[mid]== target:return mid
elif array[mid]> target:
end = mid
else:
begin = mid +1return-1deftest():assert binary_search([0,1,2,3,4,5],1)==1assert binary_search([0,1,2,3,4,5],6)==-1assert binary_search([0,1,2,3,4,5],-1)==-1assert binary_search([0,1,2,3,4,5],0)==0assert binary_search([0,1,2,3,4,5],5)==5assert binary_search([0],0)==0assert binary_search([],1)==-1
在CMD中输入指令:pytest binarysearch.py
输出为:
================================================= test session starts =================================================
platform win32 – Python 3.10.9, pytest-7.1.2, pluggy-1.0.0
rootdir: C:\Users\h13je\Working_Log\01092023\python_learning
plugins: anyio-3.5.0
collected 1 item
binarysearch.py . [100%]
================================================== 1 passed in 0.02s ==================================================
版权归原作者 练习两年半的工程师 所有, 如有侵权,请联系我们删除。