在独立类中定义pytest固定装置

时间:2019-07-12 17:13:00

标签: pytest fixtures

我从另一个question开始,建议在fixtures中使用pytest

我正在尝试确定fixtures是否可以驻留在独立类中。网上的示例将它们作为独立函数或从另一个类继承

我的用例

为什么我需要它们独立?

我有一个可以连接到外部目录服务器(例如LDAP)的类。此类将具有fixtures来创建/删除目录服务器中的对象。

多个LDAP测试类应该能够使用ExternalDirectory类并连接到不同的LDAP目录服务器

- external_server.py

import ldap
import pytest

class ExternalDirectory(object):
  def __init__(self, creds):
    self.connection = #connect to LDAP server

  @pytest.fixture
  def create_user(self):
    user = []
    def _create_user(self, user_name):
      #create user in ldap
      user.append(user_name)

    yield _create_user
    #delete user list

  #More fixtures of such kind

  def utility_method1(self):
    # some util method

  #More such util methods

测试类将使用此类

- test_ldap_users.py

import ExternalDirectory

class TestLdapUser(object):
  @classmethod
  def setup_class(cls):
    #Fetch credentials from some YAML
    cls.ldap_connection = ExternalDirectory(creds)

  def test_ldap_user_create(self, <need-to-call-create-user-fixture-here>):
    create_user('some-user-name')
    ...

问题

但是我无法在测试用例中调用此灯具。实际上,我什至不知道该如何称呼他们:)

替代方法

继承ExternalDirectory类。但是然后,我需要删除__init__并将其移至setup_class的{​​{1}},然后在ExternalDirectory中调用setup_class

替代方法的局限性

TestLdapUser的{​​{1}}方法中创建的connection属性对于每个LDAP测试类都不是唯一的

问题

什么是处理此问题的好方法?

1 个答案:

答案 0 :(得分:0)

我目前正在使用一种方法,但我不喜欢它

<VirtualHost *:80>
    ServerName emp.lcl
    DocumentRoot "c:/wamp64/www/emp"
    <Directory  "c:/wamp64/www/emp/">
        Options +Indexes +Includes +FollowSymLinks +MultiViews
        AllowOverride All
        Require local
        RewriteEngine on
        RewriteRule "^/api/employee/search/(.*)$" "/api/employee.py"
    </Directory>
</VirtualHost>

为什么我不喜欢它?

我需要为不同的服务器创建多个LDAP对象,因此我希望实现class LDAPFixtures(object): @classmethod def setup_class(cls, init_data): cls.connection = LDAPConnectionInit(init_data) @pytest.fixture def create_and_delete_ou(self): ou_list = [] def _create_organizational_unit(ou_name): # Code to create an OU ou_list.append(ou_name) yield _create_organization_unit # Code to delete OU class TestLDAPConnections(LDAPFixtures): def test_ou_1(self, create_and_delete_ou): # Do something ... # Now call the fixture create_and_delete_ou(random_ou_name) # Continue to do something and conclude the test ,为每个LDAP连接创建多个对象,然后从该对象调用固定装置。

因此,我需要继承关系而不是继承关系。所以像这样的东西会很酷

__init__