Skip to main content
 首页 » 编程设计

python之引发异常的单元测试方法

2025年05月04日20birdshome

如果我们传递错误的 item_id - find_price_of_given_id,我会尝试单元测试负责返回给定产品价格的方法是否引发异常。

测试:

import unittest 
from Automat import Automat 
from Bank import Bank 
from Item import Item 
from exceptions.NoItemException import NoItemException 
 
 
class AutomatTest(unittest.TestCase): 
 
    def test_checkPriceOfGivenID(self): 
        bank = Bank() 
        automat = Automat(bank) 
        Cola = Item(2) 
        automat.add_object(Cola) 
        self.assertEqual(automat.find_price_of_given_id(30), 2) 
 
    def test_checkPriceOfGivenIDWithInvalidID(self): 
        bank = Bank() 
        automat = Automat(bank) 
        Cola = Item(2) 
        automat.add_object(Cola) 
        self.assertRaises(NoItemException, automat.find_price_of_given_id(31)) 

自动化类:

if __name__ == '__main__': 
    unittest.main() 
 
 
from Item import Item 
from exceptions.NoItemException import NoItemException 
from exceptions.NoProperAmountException import NoProperAmountException 
from Coin import Coin 
from decimal import * 
class Automat: 
 
    def __init__(self, _bank, objects=None): 
        self.item_id = 30 
        self.bank = _bank 
        if objects is None: 
            objects = {} 
 
 
        self.objects = objects 
        self.purchaseItemBank = [] 
 
    def add_object(self, obj: Item): 
        id_to_assign = self.item_id 
        self.objects.update({id_to_assign: obj}) 
        self.item_id += 1 
        return id_to_assign 
 
    def find_price_of_given_id(self, item_id): 
        if self.objects.get(item_id) is not None: 
            return self.objects.get(item_id).get_price() 
        else: 
            raise NoItemException 
 
    def find_amount_of_given_id(self, item_id): 
        if self.objects.get(item_id) is not None: 
            return self.objects.get(item_id).get_amount() 
        else: 
            raise NoItemException 
 
    def checkIfAmountIsPositive(self, item_id): 
        if self.objects.get(item_id) is not None: 
            var = True if self.objects.get(item_id).get_amount() > 0 else False 
            return var 
        else: 
            raise NoItemException 
 
    def withdrawItem(self, item_id): 
        self.objects.get(item_id).decrease() 
 
    def getAmountOfGivenNominal(self, coinValue): 
        counter = 0 
        for iterator in self.bank.bank: 
            if iterator.getCoinValue() == coinValue: 
                counter += 1 
        return counter 

不幸的是我得到了

Error 
Traceback (most recent call last): 
  File "C:\ProgramData\Anaconda3\lib\unittest\case.py", line 59, in testPartExecutor 
    yield 
  File "C:\ProgramData\Anaconda3\lib\unittest\case.py", line 615, in run 
    testMethod() 
  File "C:\Users\Admin\PycharmProjects\vending-machine\AutomatTest.py", line 22, in test_checkPriceOfGivenIDWithInvalidID 
    self.assertRaises(NoItemException, automat.find_price_of_given_id(31)) 
  File "C:\Users\Admin\PycharmProjects\vending-machine\Automat.py", line 28, in find_price_of_given_id 
    raise NoItemException 
exceptions.NoItemException.NoItemException 
 
 
 
Ran 1 test in 0.003s 
 
FAILED (errors=1) 
 
Process finished with exit code 1 

项目类别:

class Item: 
    def __init__(self, price, amount=5): 
        self.amount = amount 
        self.price = price 
 
    def get_price(self): 
        return self.price 
 
    def get_amount(self): 
        return self.amount 
 
    def decrease(self): 
        self.amount -= 1 
 
    def __str__(self): 
        return f"{self.amount} @ {self.price}" 

请您参考如下方法:

self.assertRaises(NoItemException, automat.find_price_of_given_id(31)) 

您正在调用该方法,然后将其返回值传递给assertRaises;但在此之前,异常已经出现。这不是您使用 assertRaises 的方式。您可以通过两种方式使用它:

  1. 将您要调用的方法及其参数传递给 assertRaises:

    self.assertRaises(NoItemException, automat.find_price_of_given_id, 31) 
    

    注意:没有(),不是你自己调用的!

  2. 将其用作上下文管理器:

    with self.assertRaises(NoItemException): 
        automat.find_price_of_given_id(31)