有可能不收集标记测试吗?

时间:2012-12-11 15:18:56

标签: python pytest

目前,可以标记测试,然后使用-m参数运行它们(或不运行它们)。但是,所有测试仍然是先收集,然后才会取消选择

在下面的示例中,仍然收集了所有8个,然后运行4个并取消选择4个。

============================= test session starts ==============================
platform win32 -- Python 2.7.3 -- pytest-2.3.2 -- C:\Python27\python.exe
collecting ... collected 8 items

test_0001_login_logout.py:24: TestLoginLogout.test_login_page_ui PASSED
test_0001_login_logout.py:36: TestLoginLogout.test_login PASSED
test_0001_login_logout.py:45: TestLoginLogout.test_default_admin_has_users_folder_page_loaded_by_default PASSED
test_0001_login_logout.py:49: TestLoginLogout.test_logout PASSED

==================== 4 tests deselected by "-m 'undertest'" ====================
================== 4 passed, 4 deselected in 1199.28 seconds ===================

问题:是否可以不收集标记/未标记的测试?

问题是:

1)当数据库中已经有一些项目(比如我的设备)及其代码时,我正在使用一些测试:

@pytest.mark.device
class Test1_Device_UI_UnSelected(SetupUser):

    #get device from the database
    device = Devices.get_device('t400-alex-win7')

    @classmethod
    @pytest.fixture(scope = "class", autouse = True)
    def setup(self):
    ...

我运行测试明确排除和设备测试:py.test -m "not device"但是,在收集过程中我得到错误,因为device = Devices.get_device('t400-alex-win7')仍在执行。

2)有些测试标记为time_demanding,因为大约有400个生成的测试。要生成这些测试也需要时间。我从一般测试中排除了那些测试,但是它们是生成和收集的,然后取消选择< - 只是等待一段时间。

我知道有一个(1)问题的解决方案 - 使用pytest.fixtures并将它们传递给测试,但我真的很喜欢PyDev提供的 autocompletion

timedemanding课程是:

import pytest
#... other imports


def admin_rights_combinations(admin, containing = ["right"]):
    '''
    Generate all possible combinations of admin rights settings depending
    on "containing" restriction
    '''
    rights = [right for right in admin.__dict__.iterkeys() if any(psbl_match in right for psbl_match in containing)]
    total_list = []
    l = []
    for right in rights: #@UnusedVariable
        l.append([True, False])
    for st_of_values in itertools.product(*l):
        total_list.append(dict(zip(rights, st_of_values)))
    return total_list

@pytest.mark.timedemanding
class Test1_Admin_Rights_Access(SetupUser):

    user = UserFactory.get_user("Admin Rights Test")
    user.password = "RightsTest"
    folder = GroupFolderFactory.get_folder("Folders->Admin Rights Test Folder")
    group = GroupFolderFactory.get_group("Folders->Admin Rights Test Group")
    admin = UserFactory.get_admin("Admin Rights Test")

    @classmethod
    @pytest.fixture(scope = "class", autouse = True)
    def setup(self):
        ...

    @pytest.mark.parametrize("settings", admin_rights_combinations(admin, containing=['right_read', 
                                                                                      'right_manage_folders',
                                                                                      'right_manage_groups']))  
    def test_admin_rights_menus(self, base_url,settings):
        '''
        test combination of admin rights and pages that are displayed with 
        this rights. Also verify that menu's that are available can be opened 
        '''

正如您所看到的,到pytest点击@pytest.mark.parametrize时,它应该已经知道它在@pytest.mark.timedemanding的类中。但是,收集仍然会发生。

2 个答案:

答案 0 :(得分:2)

问题不是py.test,而是在导入文件时执行类代码这一事实,因此在>装饰器被调用之前就会出现错误

唯一的方法(不修改代码的逻辑)来避免这种情况是完全忽略整个文件。

无论如何,我不明白为什么你在那里设置device类属性。使用班级setup!如果你把这些代码放在设置中你的问题应该解决,因为,由于测试没有运行,所以也不会调用设置,你也不会收到错误。

time_demanding测试也是如此。在类级别设置中设置它们,以便py.test创建类不会花费太多时间(即使没有示例代码,我也不能说太多)。

如果你想保留这样的东西,并且让PyDev自动完成,那么,就像我说的那样,只需用一些正则表达式忽略整个文件(最终你将不得不拆分测试)。

答案 1 :(得分:0)

仅在收集完成后取消选择测试有两个原因:

  • 始终获得正确数量的整体测试
  • 集合挂钩可能会动态添加或删除标记

关于自动完成,我相信将重型设置放入灯具更为重要。我不确定Pydev是否可以学会自动完成。你也必须经常这个问题 python函数接受一个参数,其中Pydev不能真正知道它是什么类型。 FWIW我和愚蠢的vim-completion一起生活得很好,只是查看所有缓冲区中的所有字符串/名称并完成此操作。它会产生更多误报,但不会出现误报。