Использование self vs cls для доступа к переменной в unittest - PullRequest
0 голосов
/ 13 сентября 2018

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

from collections import Counter

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

И добавление *Класс 1005 * для юнит-теста, я мог бы использовать метод класса 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? , это просто соглашение по кодированию, но оноЕсть ли разница между 3-й версией unittest с @classmethod с использованием self.vocab и первыми двумя более идиоматическими тестами?

1 Ответ

0 голосов
/ 13 сентября 2018

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

def setUp(self):
    ...

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

@classmethod
def setUpClass(cls):
    ...

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

@classmethod
def setUpClass(cls):
    ...

А это:

@classmethod
def setUpClass(self):
    ...

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

...