目前,可以标记测试,然后使用-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
的类中。但是,收集仍然会发生。
答案 0 :(得分:2)
问题不是py.test
,而是在导入文件时执行类代码这一事实,因此在>>装饰器被调用之前就会出现错误。
唯一的方法(不修改代码的逻辑)来避免这种情况是完全忽略整个文件。
无论如何,我不明白为什么你在那里设置device
类属性。使用班级setup
!如果你把这些代码放在设置中你的问题应该解决,因为,由于测试没有运行,所以也不会调用设置,你也不会收到错误。
time_demanding
测试也是如此。在类级别设置中设置它们,以便py.test
创建类不会花费太多时间(即使没有示例代码,我也不能说太多)。
如果你想保留这样的东西,并且让PyDev自动完成,那么,就像我说的那样,只需用一些正则表达式忽略整个文件(最终你将不得不拆分测试)。
答案 1 :(得分:0)
仅在收集完成后取消选择测试有两个原因:
关于自动完成,我相信将重型设置放入灯具更为重要。我不确定Pydev是否可以学会自动完成。你也必须经常这个问题 python函数接受一个参数,其中Pydev不能真正知道它是什么类型。 FWIW我和愚蠢的vim-completion一起生活得很好,只是查看所有缓冲区中的所有字符串/名称并完成此操作。它会产生更多误报,但不会出现误报。