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)データベースにすでにいくつかのアイテム( my deviceなど)とそれが持っているコードがある場合、いくつかのテストを使用しています:

@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')

time_demanding2)約 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

収集が完了した後にのみテストの選択を解除するのには、次の 2 つの理由があります。

  • 常に正確な数の全体的なテストを取得する
  • コレクション フックは、マークを動的に追加または削除する場合があります

オートコンプリートに関しては、重いセットアップをフィクスチャに入れることがより重要だと思います。Pydev がまだオートコンプリートを学習できるかどうかはわかりません。この問題は、Pydev が実際に型を認識できない引数を受け取る通常の python 関数でも発生する必要があります。FWIW私は、すべてのバッファ内のすべての文字列/名前を調べてそれを完了するだけのダムのvim-completionでうまく生きています。偽陽性は増えますが、偽陰性はありません。

于 2012-12-12T08:37:40.160 に答える