Python 在unittest事务中捕获异常有什么好的理由吗?

Python 在unittest事务中捕获异常有什么好的理由吗?,python,django,unit-testing,Python,Django,Unit Testing,unittest模块非常适合检测代码中的问题。 我理解用断言隔离和测试部分代码的想法: self.assertEqual(web\u page\u view.func,web\u page\u url) 但是除了这些断言之外,在相同的测试方法中,您可能还有一些逻辑,这可能会有问题 我想知道在TestCase子类的方法中是否需要考虑手动异常处理 因为如果我在try-catch中包装一个块,如果某个部分失败,测试将返回OK且不会失败: def test_simulate_requests(s

unittest模块非常适合检测代码中的问题。 我理解用断言隔离和测试部分代码的想法:

self.assertEqual(web\u page\u view.func,web\u page\u url)

但是除了这些断言之外,在相同的测试方法中,您可能还有一些逻辑,这可能会有问题

我想知道在TestCase子类的方法中是否需要考虑手动异常处理

因为如果我在try-catch中包装一个块,如果某个部分失败,测试将返回OK且不会失败:

    def test_simulate_requests(self):
        """
        Simulate requests to a url
        """
        try:
           response = self.client.get('/adress/of/page/')
           self.assertEqual(response.status_code, 200)
        except Exception as e:
            print("error: ", e)
在此类测试中是否应始终避免异常处理?

测试有两种“坏”状态:失败(当其中一个断言失败时)和错误(当测试本身失败时-您的情况)

首先,不言而喻,构建测试的方式最好能达到其断言

如果需要断言某些测试代码引发异常,则应将
与self.assertRaises(ExpectedError)

如果测试中的某些代码引发异常-最好从“错误”结果中了解它,而不是看到“确定所有测试均已通过”

如果您的测试逻辑真的假设测试本身可能失败,并且这是正常行为,那么测试可能是错误的。可能您应该使用mocks()来模拟api调用或其他东西

在您的情况下,即使测试失败,您也会用bare Exception捕捉它并说“Ok,continue”。无论如何,实现是错误的

最后:不,除了在测试用例中,不应该有

另外,最好使用test_what_you_to_test_name调用您的测试函数,在这种情况下,可能test_successful_请求就可以了。

测试有两种“坏”状态:失败(当其中一个断言失败时)和错误(当测试本身失败时-您的情况)

首先,不言而喻,构建测试的方式最好能达到其断言

如果需要断言某些测试代码引发异常,则应将
与self.assertRaises(ExpectedError)

如果测试中的某些代码引发异常-最好从“错误”结果中了解它,而不是看到“确定所有测试均已通过”

如果您的测试逻辑真的假设测试本身可能失败,并且这是正常行为,那么测试可能是错误的。可能您应该使用mocks()来模拟api调用或其他东西

在您的情况下,即使测试失败,您也会用bare Exception捕捉它并说“Ok,continue”。无论如何,实现是错误的

最后:不,除了在测试用例中,不应该有

另外,最好用test_what_what_to_test_name调用您的测试函数,在这种情况下,可能test_successful_请求就可以了。

答案的第一部分:

正如您正确地说的,在实际测试之前需要有一些逻辑。属于单元测试的代码可以分为四个部分(我在下面使用Meszaros的术语):设置、练习、验证和拆卸。通常情况下,测试用例的代码的结构是这样的:四个部分的代码被清晰地分开,并以精确的顺序出现——这被称为四阶段测试模式

练习阶段是测试的核心,在此阶段执行测试中应检查的功能。该设置确保这在定义良好的上下文中发生。因此,您在本术语中描述的是在设置过程中出现故障的情况。这意味着,未满足有意义地执行要测试的功能所需的先决条件

这是一种常见的情况,这意味着您实际上需要能够区分测试的三种结果:测试可以成功通过,也可以失败,或者毫无意义

幸运的是,在python中有一个答案:您可以跳过测试,如果跳过了测试,这将被记录下来,但既不是失败也不是成功。跳过测试可能是处理示例中所示情况的更好方法。下面是一个小代码段,演示了跳过测试的一种方法:

import unittest
class TestException(unittest.TestCase):
   def test_skipTest_shallSkip(self):
      self.skipTest("Skipped because skipping shall be demonstrated.")
回答的第二部分:

您的测试似乎有一些不确定的元素。
self.client.get
可以抛出异常(但只是有时——有时不会)。这意味着您在测试执行期间没有控制上下文。在单元测试中,您应该尽量避免这种情况。您的测试应该具有确定性行为

实现这一点的一个典型方法是将代码与负责不确定性的组件隔离,并在测试期间用模拟替换这些组件。模拟的行为完全受测试代码的控制。因此,如果您的代码使用某个组件进行网络访问,您将模拟该组件。然后,在某些测试用例中,您可以指示模拟模拟模拟成功的网络通信,以查看组件如何处理此问题,在其他测试中,您可以指示模拟模拟模拟网络故障,以查看组件如何处理此情况。

答案的第一部分:

正如您正确地说的,在实际测试之前需要有一些逻辑。属于单元测试的代码可以分为四个部分(我在下面使用Meszaros的术语):设置、练习、验证和拆卸。通常情况下,测试用例的代码的结构是这样的:四个部分的代码被清晰地分开,并以精确的顺序出现——这被称为四阶段测试模式

练习阶段是测试的核心,在此阶段执行测试中应检查的功能。该设置确保这在定义良好的上下文中发生。所以,你所描述的就是这个术语