0


Python 面试:单元测试unit testing & 使用pytest

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 ==================================================


本文转载自: https://blog.csdn.net/weixin_57266891/article/details/132579162
版权归原作者 练习两年半的工程师 所有, 如有侵权,请联系我们删除。

“Python 面试:单元测试unit testing & 使用pytest”的评论:

还没有评论