Использование self vs cls для доступа к переменной в unittest

1

Допустим, у меня есть простой объект класса, который выглядит как какой-то Counter (конечно, у него есть другие функции, но он не подходит для этого вопроса):

from collections import Counter

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

И добавив класс Vocabulary к unittest, я мог бы использовать setUpClass 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)

И оба вышеизложенного будут работать нормально. Но что, если у меня какая-то непитоническая картина:

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)

Согласно " Что такое переменная" cls ", используемая в классах Python? , это просто соглашение о кодировании, но есть ли разница между третьей версией unittest с @classmethod с использованием self.vocab и первых двух более идиоматических тестов?

  • 0
    Первый и третий одинаковы, второй отличается.
  • 0
    Первый из них сделал бы NameError , потому что внутри test_counts_set_correctly образом имя cls не будет связано, насколько я могу судить.
Показать ещё 1 комментарий
Теги:
unit-testing
self
class-method

1 ответ

2

Для подклассов unittest.TestCase не выполняйте никаких тестовых настроек в __init__. Это не для чего. Если вы хотите, чтобы установка выполнялась один раз для тестового метода, поместите ее здесь:

def setUp(self):
    ...

Если вы хотите, чтобы установка выполнялась один раз на тестовый класс, поместите ее здесь:

@classmethod
def setUpClass(cls):
    ...

Наконец, позвольте обратиться к заблуждению. Технически нет никакой разницы между этим:

@classmethod
def setUpClass(cls):
    ...

И это:

@classmethod
def setUpClass(self):
    ...

Второй - просто более запутанный/плохой способ написания первого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню