J'utilise du sélénium pour des tests de bout en bout et je ne sais pas comment l'utiliser setup_class
et les teardown_class
méthodes.
Je dois configurer le navigateur dans la setup_class
méthode, puis effectuer un tas de tests définis comme méthodes de classe et enfin quitter le navigateur dans la teardown_class
méthode.
Mais logiquement, cela semble être une mauvaise solution, car en fait mes tests ne fonctionneront pas avec la classe, mais avec l'objet. Je passe self
param dans chaque méthode de test, donc je peux accéder aux variables des objets:
class TestClass:
def setup_class(cls):
pass
def test_buttons(self, data):
# self.$attribute can be used, but not cls.$attribute?
pass
def test_buttons2(self, data):
# self.$attribute can be used, but not cls.$attribute?
pass
def teardown_class(cls):
pass
Et il ne semble même pas correct de créer une instance de navigateur pour la classe. Elle devrait être créée séparément pour chaque objet, non?
Donc, j'ai besoin d'utiliser __init__
et des __del__
méthodes au lieu de setup_class
et teardown_class
?
resource
param danstest_that_depends_on_resource(self, resource)
Lorsque vous écrivez des "tests définis comme méthodes de classe" , voulez-vous vraiment dire des méthodes de classe (méthodes qui reçoivent sa classe comme premier paramètre) ou juste des méthodes régulières (méthodes qui reçoivent une instance comme premier paramètre)?
Étant donné que votre exemple utilise
self
pour les méthodes de test, je suppose que c'est la dernière, il vous suffit donc d'utiliser à lasetup_method
place:L'instance de la méthode de test est transmise à
setup_method
etteardown_method
, mais peut être ignorée si votre code de configuration / suppression n'a pas besoin de connaître le contexte de test. Plus d'informations peuvent être trouvées ici .Je vous recommande également de vous familiariser avec les appareils de py.test , car ils sont un concept plus puissant.
la source
setup_class
avec des méthodes simulées et autres nécessitaient d'être modernisés.setup_class(self, foo, bar)
->setup_method(self,function,foo,bar)
Cela pourrait aider http://docs.pytest.org/en/latest/xunit_setup.html
Dans ma suite de tests, je regroupe mes cas de test en classes. Pour la configuration et le démontage dont j'ai besoin pour tous les cas de test de cette classe, j'utilise les méthodes de classe
setup_class(cls)
etteardown_class(cls)
.Et pour la configuration et le démontage dont j'ai besoin pour chacun des cas de test, j'utilise le
setup_method(method)
etteardown_method(methods)
Exemple:
Maintenant, lorsque j'exécute mes tests, lorsque l'exécution de TestClass démarre, il enregistre les détails du moment où elle commence l'exécution, quand elle se termine l'exécution et de même pour les méthodes.
Vous pouvez ajouter d'autres étapes de configuration et de démontage que vous pourriez avoir dans les emplacements respectifs.
J'espère que ça aide!
la source
setup_class
vssetup_method
?<setup/teardown>_class
pour toute la classe. Ici, il peut s'agir de définir le lien vers la base de données ou de charger le fichier de données. Et puis, chaque cas de test peut avoir sa propre configuration sous la forme de<setup/teardown>_method
. Les choses sont bien claires maintenant. Merci beaucoup!Comme @Bruno l'a suggéré, l'utilisation de fixtures pytest est une autre solution accessible pour les deux classes de test ou même pour de simples fonctions de test. Voici un exemple de test des fonctions python2.7 :
Ainsi, courir
test_1...
produit:Notez qu'il
stuff_i_setup
est référencé dans l'appareil, permettant à cet objet d'êtresetup
ettorn down
pour le test avec lequel il interagit. Vous pouvez imaginer que cela pourrait être utile pour un objet persistant, comme une base de données hypothétique ou une connexion, qui doit être effacé avant chaque test pour les maintenir isolés.la source
Votre code doit fonctionner exactement comme vous vous y attendez si vous ajoutez des
@classmethod
décorateurs.Voir http://pythontesting.net/framework/pytest/pytest-xunit-style-fixtures/
la source
self
est utilisé pour les méthodes d'instance, où le premier argument est l'instance d'objet spécifique sur laquelle l'opération de méthode a lieu, tandis quecls
est utilisé pour@classmethod
s, qui sont liés à la classe et non une instance de la classe (c'est-à-dire un objet).