【问题标题】:Using self vs cls to access variable in unittest使用 self vs cls 访问 unittest 中的变量
【发布时间】:2019-02-17 16:28:02
【问题描述】:

假设我有一个简单的类对象,它看起来像某种Counter(当然它还有其他功能,但它超出了这个问题的范围):

from collections import Counter

class Vocabulary:
    def __init__(self, words):
        self.vocab = Counter(words)

Vocabulary 类添加到单元测试中,我可以使用setUpClass 类方法:

import unittest

class VocabularyTests(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.vocab = Vocabulary(["z", "a", "b", "c", "f", "d", "e", "g", "a", "d", "b", "e", "w"])


    def test_counts_set_correctly(self):
        self.assertEqual(cls.vocab["a"], 2)

或者我可以使用self:

class VocabularyTests(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        super(VocabularyTests, self).__init__(*args, **kwargs)
        self.vocab = Vocabulary(["z", "a", "b", "c", "f", "d", "e", "g", "a", "d", "b", "e", "w"])

    def test_counts_set_correctly(self):
        self.assertEqual(self.vocab["a"], 2)

以上两种方法都可以正常工作。但是,如果我有一种非pythonic模式怎么办:

import unittest

class VocabularyTests(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        self.vocab = Vocabulary(["z", "a", "b", "c", "f", "d", "e", "g", "a", "d", "b", "e", "w"])


    def test_counts_set_correctly(self):
        self.assertEqual(self.vocab["a"], 2)

根据What is the 'cls' variable used for in Python classes?,这只是一个编码约定,但是使用@classmethodself.vocab 的第三版单元测试与前两个更惯用的测试之间有什么区别吗?

【问题讨论】:

  • 第一个和第三个相同,第二个不同。
  • 第一个会创建一个NameError,因为据我所知,test_counts_set_correctly 内部的名称 cls 不会被绑定。
  • @wim 哦,没注意到。是的,那会失败

标签: python unit-testing self class-method


【解决方案1】:

对于unittest.TestCase 子类,不要在__init__ 中进行任何测试设置。那不是它的用途。如果您希望每个测试方法执行一次设置,请将其放在这里:

def setUp(self):
    ...

如果您希望每个测试执行一次设置,请将其放在这里:

@classmethod
def setUpClass(cls):
    ...

最后让我们解决一个误解。这在技术上没有区别:

@classmethod
def setUpClass(cls):
    ...

还有这个:

@classmethod
def setUpClass(self):
    ...

第二个只是第一个更令人困惑/糟糕的写法。

【讨论】:

    猜你喜欢
    • 2018-12-22
    • 2017-12-20
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多