3

目前,可以标记测试,然后使用-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 提供的自动完成功能。

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它时,它应该已经知道它在 Class with 中@pytest.mark.timedemanding。但是,收集仍然发生。

4

2 回答 2

2

问题不在于py.test,而是在导入文件时执行了类代码,因此您甚至在调用装饰器之前就收到了错误。

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

无论如何,我不明白你为什么在device那里设置类属性。使用班级级别setup!如果您将该代码放入设置中,您的问题应该得到解决,因为由于未运行测试,因此也不会调用设置并且您不会收到错误。

测试也是如此time_demanding。在类级别设置中设置它们,这样py.test类的创建就不会花费太多时间(尽管没有示例代码,我对此不能说太多)。

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

于 2012-12-11T17:06:07.253 回答
0

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

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

关于自动完成,我认为将繁重的设置放入固定装置中更为重要。我不确定 Pydev 是否​​还能学会自动完成。对于常规的 python 函数,您也必须遇到这个问题,这些函数接受 Pydev 无法真正知道它是什么类型的参数。FWIW 我对愚蠢的 vim-completion 生活得很好,它只是查看所有缓冲区中的所有字符串/名称并完成它。它给出了更多的误报,但没有误报。

于 2012-12-12T08:37:40.160 回答