2017-01-27 4 views
0

Ich habe diese Datei:zur Initialisierung "Konflikte" mit parametrisieren Optionen 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) 

und diese Testdatei:

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() 

Nun, mein Problem ist, dass ich die Werte initialisiert werden (var_name, the_method) in der Setup-Klasse.

Also, wenn ich verschiedene Werte in der Parametrierung verwende, werden diese Werte ignoriert.

So ist der Test jetzt wird berechnet, indem als the_method Wert als Whatever und nicht als Average (was ich will in den verschiedenen parametrisieren Setup haben) getan.

Gibt es eine Möglichkeit, damit umzugehen, ohne die setup_class zu verlieren?

Weil, wenn ich die setup_class weglassen, ok es funktioniert.

+0

Wenn ich Sie richtig verstanden habe: Sie wollen 'setup_class' beibehalten, um das Objekt zu initialisieren, aber Parameter wie' Whatever' und 'Average' separat testen? Schließlich beabsichtigen Sie zwei Tests zu haben: für "Was auch immer" und "Durchschnittlich", oder? –

+0

@PiotrDawidiuk: Ja, ich möchte setup_class in der Lage sein, die Variablen zu initialisieren. Und ich möchte 'parametrize' verwenden, um meine Tests zu machen. Ich will, was in' parametrize' existiert, ausgewertet und getestet werden. Rechtzeitig 'parametrisiert' wird "übersprungen" und nur was in der Variablen-Initialisierung vorhanden ist, wird getestet. – George

Antwort

0

Nun können Sie die Verantwortung der setup_class Methode auf eine Erstellung von Variablen Instanz mit allen möglichen nicht-Wurfausnahmedaten

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

und erstellen Tests

@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 

Aber persönlich begrenzen nur, Ich glaube nicht, None s an den Konstrukteur zu übergeben ist eine sehr saubere Lösung. Ich schlage vor, die Parameter optional zu machen oder jedes Mal Variablen zu erstellen.

+0

Die Parameter optional machen? Sie meinen die Klasseninitialisierungsargumente? Oder die Parameter von th pytest.parametrize? Und optional meinen Sie, sie nicht zu verwenden? Die andere Lösung, Variablen in jedem Test zu erzeugen, wird zu vielen kleinen Testfunktionen führen, was auch nicht gut ist. – George

+0

@George Ich meine Initialisierungsargumente optional erstellen :) Diese Argumente können optional sein, aber ... es hängt davon ab, ob sie notwendig sind (Objekt ohne sie könnte keinen Sinn haben und es wird Ihre Domäne brechen). Und über viele kleine Tests - wiederum kann Ihr Objekt veränderlich oder unveränderlich sein. Es hängt von Ihrem Konzept und Ihrer Domain ab. –

+0

@George Und mit optional meine ich 'def __init __ (selbst, * args)' oder 'def __init __ (selbst, ** kwargs)' –

Verwandte Themen