2017-01-27 12 views
0

У меня есть этот файл:использования setup_class для инициализации «конфликтов» с вариантами параметризующих

import numpy as np 


class Variables(object): 

    def __init__(self, var_name, the_method): 

     self.var_name = var_name 
     self.the_method = the_method 

    def evaluate_v(self): 
     var_name, the_method = self.var_name, self.the_method 

     if the_method == 'Average': 
      return np.average(var_name) 

и тестовый файл:

import unittest 
import pytest 
import numpy as np 

from .variables import Variables 


class TestVariables(): 

    @classmethod 
    def setup_class(cls): 
     var_name = np.array([1, 2, 3]) 
     the_method = 'Whatever' 
     cls.variables = Variables(var_name, the_method) 

    @pytest.mark.parametrize(
     "var_name, the_method, expected_output", [ 
      (np.array([1, 2, 3]), 'Average', 2), 
     ]) 
    def test_evaluate_v_method_returns_correct_results(
     self, var_name, the_method,expected_output): 

     var_name, the_method = self.variables.var_name, self.variables.the_method 

     obs = self.variables.evaluate_v() 
     assert obs == expected_output 

if __name__ == "__main__": 
    unittest.main() 

Теперь моя проблема в том, что я инициализировать значение (var_name, the_method) в классе настройки.

Итак, когда я использую разные значения в параметризации, эти значения игнорируются.

Итак, тест прямо сейчас делается, взяв в качестве the_method ценности как Whatever, а не как Average (который я хочу иметь в различных настройках параметризующих).

Есть ли способ справиться с этим, не теряя setup_class?

Потому что, если я опускаю setup_class, нормально работает.

+0

Если я правильно понял вас: вы хотите, чтобы 'setup_class' инициализировал объект, но параметры теста, такие как' Whatever' и 'Average' отдельно? Наконец, вы намерены провести два теста: для 'Whatever' и' Average', правильно? –

+0

@PiotrDawidiuk: Да, я хочу, чтобы setup_class мог инициализировать переменные. И я хочу использовать 'parametrize' для выполнения своих тестов. Я хочу, чтобы все, что существует внутри' parametrize', оценивалось и тестировалось. Теперь «параметризованный» «пропущен» и проверяется только то, что существует в инициализации переменных. – George

ответ

0

Ну, вы можете просто ограничить ответственность setup_class метода к созданию экземпляра Variables' с любыми данными, не метания-исключения

@classmethod 
    def setup_class(cls):    
     cls.variables = Variables(None, None) 

и создавать тесты

@pytest.mark.parametrize(
     "var_name, the_method, expected_output", [ 
      (np.array([1, 2, 3]), 'Average', 2), 
      (np.array([1, 2, 3]), 'Whatever', 'whatever you want') 
     ]) 
    def test_evaluate_v_method_returns_correct_results(
     self, var_name, the_method, expected_output): 

     self.variables.var_name = var_name 
     self.variables.the_method = the_method 

     assert self.variables.evaluate_v() == expected_output 

Но лично, Я не думаю, что передача None s в конструктор - очень чистое решение. Я предлагаю сделать параметры необязательными или создать экземпляр Variables каждый тест.

+0

Сделать параметры необязательными? Вы имеете в виду аргументы инициализации класса? Или параметры pytest.parametrize? А по выбору вы имеете в виду, что не используете их? Другое решение, создающее переменные в каждом тесте, приведет к множеству небольших тестовых функций, что тоже не очень хорошо. – George

+0

@George Я имею в виду создание аргументов инициализации необязательно :) Эти аргументы могут быть необязательными, но ... это зависит, если они необходимы (объект без них может не иметь смысла, и он сломает ваш домен). И о многих небольших тестах - опять же, ваш объект может быть изменчивым или неизменным. Это зависит от вашей концепции и домена. –

+0

@George И по выбору я имею в виду 'def __init __ (self, * args)' или 'def __init __ (self, ** kwargs)' –

 Смежные вопросы

  • Нет связанных вопросов^_^