首页 > 解决方案 > python - 如何为python中的非失败方法编写测试用例以执行除块至少一次

问题描述

我创建了一个如下的python类 -

class MyClass:
    mydict = {}
    error = None
    traceback = None
    message = None

    def create_log_message(self, **kwargs):
        try:
            error = kwars.get("error", self.error)
            traceback = kwargs.get("traceback", self.traceback)
            message = kwargs.get("message", self.message)
            self.mydict = {"error": error, "traceback": traceback, "message": message}
            return self.mydict
        except Exception as e:
            error = e
            traceback = tb.format_exc()
            message = kwargs.get("message", self.message)
            self.mydict = {"error": error, "traceback": traceback, "message": message}
            return self.mydict

下面是我的测试课-

import unittest import TestCase
import traceback as tb
import MyClass
class TestMyClass(TestCase):
    def test_success(self):                                       # Test in case of success
        inst = MyClass()
        mydict = inst.create_log_message(message="success")
        self.assertEqual(mydict["error"], None)
        self.assertEqual(mydict["traceback"], None)
        self.assertEqual(mydict["message"], "success")
 
    def test_failure(self):                                       # test in case of exception
        try:
            1/0
        except ArithmeticError as e:
            error = e
            traceback = tb.format_exc()
            inst = MyClass()
            mydict = inst.create_log_message(error=error, traceback=traceback, message="failure")
            self.assertEqual(mydict["error"], error)
            self.assertEqual(mydict["traceback"], traceback)
            self.assertEqual(mydict["message"], "failure")

    def test_no_args(self):                                       # test for no argument being passed
        inst = MyClass()
        mydict = inst.create_log_message()
        self.assertEqual(mydict["error"], None)
        self.assertEqual(mydict["traceback"], None)
        self.assertEqual(mydict["message"], None)

    def test_extra_args(self):                                    # test for any other argument
        inst = MyClass()
        mydict = inst.create_log_message(name="test")
        with self.assertRaises(KeyError):
            self.assertEqual(mydict["name"], "test")
        self.assertEqual(mydict["error"], None)
        self.assertEqual(mydict["traceback"], None)
        self.assertEqual(mydict["message"], None)

我的问题是 MyClass 中的 except 块甚至没有被调用一次,即使我没有传递任何争论、匹配的参数或任何其他/额外的参数,因此代码覆盖率失败(不满足 100%),如何通过执行 except 块测试用例至少一次?我正在使用 python3.8x/ubuntu20.04。

在这方面的任何帮助都会非常有帮助:)

PS:如果我错过了任何细节,请原谅,因为这是我关于堆栈溢出的第一篇文章。

标签: pythonunit-testingubuntuexceptioncode-coverage

解决方案


首先,你真的需要那个 except 子句吗?你在处理什么错误?try 块中的代码不会引发任何异常,因此无法引发异常。我不会专注于如何测试该代码,而是将其删除。你不需要它。


推荐阅读