<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Pytest 教程 > 原文: [http://zetcode.com/python/pytest/](http://zetcode.com/python/pytest/) Pytest 教程展示了如何使用 Pytest 模塊測試 Python 應用。 ## python Pytest Pytest 是用于測試 Python 應用的 Python 庫。 它是鼻子測試和單元測試的替代方法。 ## Pytest 安裝 使用以下命令安裝 Pytest: ```py $ pip install pytest ``` 這將安裝 Pytest 庫。 ## Pytest 測試發現約定 如果未指定任何參數,則在`testpaths`(如果已配置)或當前目錄中的位置搜索測試文件。 另外,命令行參數可以在目錄,文件名或節點 ID 的任何組合中使用。 Pytest 在所選目錄中查找`test_*.py`或`*_test.py`文件。 在選定的文件中,Pytest 在類之外查找帶前綴的測試函數,并在帶前綴的測試類中查找帶前綴的測試方法(無`__init__()`方法)。 ## 運行 Pytest Pytest 不帶任何參數,將查看當前工作目錄(或其他一些預配置的目錄)以及測試文件的所有子目錄,并運行找到的測試代碼。 ```py $ pytest ``` 運行當前目錄中的所有測試文件。 ```py $ pytest min_max_test.py ``` 我們可以通過指定名稱作為參數來運行特定的測試文件。 ```py $ pytest min_max_test.py::test_min ``` 可以通過在`::`字符后提供其名稱來運行特定函數。 ```py $ pytest -m smoke ``` 標記可用于對測試進行分組。 然后使用`pytest -m`運行一組標記的測試。 ```py $ pytest -k <expression> ``` 另外,我們可以使用表達式來運行與測試函數和類的名稱匹配的測試。 ## Python Pytest 簡單示例 在第一個示例中,我們將使用 Pytest 測試兩個簡單的數學算法。 `algo.py` ```py def max(values): _max = values[0] for val in values: if val > _max: _max = val return _max def min(values): _min = values[0] for val in values: if val < _min: _min = val return _min ``` 我們有一個帶有自定義`max()`和`min()`函數的模塊。 `min_max_test.py` ```py #!/usr/bin/env python3 import algo def test_min(): values = (2, 3, 1, 4, 6) val = algo.min(values) assert val == 1 def test_max(): values = (2, 3, 1, 4, 6) val = algo.max(values) assert val == 6 ``` 測試文件`min_max_test.py`的名稱中包含一個測試詞。 ```py def test_min(): values = (2, 3, 1, 4, 6) val = algo.min(values) assert val == 1 ``` 此外,測試函數`test_min()`具有測試字。 我們使用`assert`關鍵字來測試算法的值。 ```py $ pytest min_max_test.py ================================================= test session starts ================================================= platform win32 -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0 rootdir: C:\Users\Jano\Documents\pyprogs\pytest collected 2 items min_max_test.py .. [100%] ============================================== 2 passed in 0.03 seconds =============================================== ``` 這是輸出。 有兩個測試,并且都成功通過了。 `pytest -v min_max_test.py`顯示了更詳細的輸出。 ## Pytest 跳過 使用跳過裝飾器,我們可以跳過指定的測試。 跳過測試有多種原因。 例如,數據庫/在線服務目前不可用,或者我們跳過了 Windows 上針對 Linux 的特定測試。 `skipping.py` ```py #!/usr/bin/env python3 import algo import pytest @pytest.mark.skip def test_min(): values = (2, 3, 1, 4, 6) val = algo.min(values) assert val == 1 def test_max(): values = (2, 3, 1, 4, 6) val = algo.max(values) assert val == 6 ``` 在示例中,`test_min()`被跳過。 ```py $ pytest min_max_test.py ================================================= test session starts ================================================= platform win32 -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0 rootdir: C:\Users\Jano\Documents\pyprogs\pytest collected 2 items min_max_test.py s. [100%] ========================================= 1 passed, 1 skipped in 0.04 seconds ========================================= ``` 在測試文件名后面的輸出中,`s`代表跳過的和。 通過。 ## Pytest 標記 我們可以使用標記將測試組織為單元。 `marking.py` ```py #!/usr/bin/env python3 # pytest -m a marking.py # pytest -m b marking.py import pytest @pytest.mark.a def test_a1(): assert (1) == (1) @pytest.mark.a def test_a2(): assert (1, 2) == (1, 2) @pytest.mark.a def test_a3(): assert (1, 2, 3) == (1, 2, 3) @pytest.mark.b def test_b1(): assert "falcon" == "fal" + "con" @pytest.mark.b def test_b2(): assert "falcon" == f"fal{'con'}" ``` 我們有兩組由標記`a`和`b`標識的測試。 這些單元由`pytest -m a marking.py`和`pytest -m b marking.py`運行。 ## Pytest 參數化測試 通過參數化測試,我們可以向斷言中添加多個值。 我們使用`@pytest.mark.parametrize`標記。 `parametrized.py` ```py #!/usr/bin/env python3 import algo import pytest @pytest.mark.parametrize("data, expected", [((2, 3, 1, 4, 6), 1), ((5, -2, 0, 9, 12), -2), ((200, 100, 0, 300, 400), 0)]) def test_min(data, expected): val = algo.min(data) assert val == expected @pytest.mark.parametrize("data, expected", [((2, 3, 1, 4, 6), 6), ((5, -2, 0, 9, 12), 12), ((200, 100, 0, 300, 400), 400)]) def test_max(data, expected): val = algo.max(data) assert val == expected ``` 在示例中,我們使用多個輸入數據測試這兩個函數。 ```py @pytest.mark.parametrize("data, expected", [((2, 3, 1, 4, 6), 1), ((5, -2, 0, 9, 12), -2), ((200, 100, 0, 300, 400), 0)]) def test_min(data, expected): val = algo.min(data) assert val == expected ``` 我們將兩個值傳遞給測試函數:數據和期望值。 在我們的例子中,我們用三個數據元組測試`min()`函數。 ```py $ pytest parametrized.py ================================================= test session starts ================================================= platform win32 -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0 rootdir: C:\Users\Jano\Documents\pyprogs\pytest collected 6 items parametrized.py ...... [100%] ============================================== 6 passed in 0.03 seconds =============================================== ``` Pytest 輸出告知有六次運行。 ## Pytest 夾具 測試需要在一組已知對象的背景下進行。 這組對象稱為測試夾具。 `algo.py` ```py def sel_sort(data): if not isinstance(data, list): vals = list(data) else: vals = data size = len(vals) for i in range(0, size): for j in range(i+1, size): if vals[j] < vals[i]: _min = vals[j] vals[j] = vals[i] vals[i] = _min return vals ... ``` 對于此示例,我們向`algo.py`模塊添加了一個選擇排序算法。 `fixtures.py` ```py #!/usr/bin/env python3 import algo import pytest @pytest.fixture def data(): return [3, 2, 1, 5, -3, 2, 0, -2, 11, 9] def test_sel_sort(data): sorted_vals = algo.sel_sort(data) assert sorted_vals == sorted(data) ``` 我們用夾具測試選擇排序。 ```py @pytest.fixture def data(): return [3, 2, 1, 5, -3, 2, 0, -2, 11, 9] ``` 我們的測試裝置僅返回一些測試數據。 請注意,我們通過其名稱引用此燈具:`data`。 ```py def test_sel_sort(data): sorted_vals = algo.sel_sort(data) assert sorted_vals == sorted(data) ``` 在`test_sel_sort()`函數中,我們將數據夾具作為函數參數傳遞。 ```py $ pytest fixtures.py ================================================= test session starts ================================================= platform win32 -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0 rootdir: C:\Users\Jano\Documents\pyprogs\pytest collected 1 item fixtures.py . [100%] ============================================== 1 passed in 0.02 seconds =============================================== ``` 這是輸出。 ## Pytest 布局 Python 測試可以多種方式組織。 測試可以集成在 Python 包中,也可以放在包外。 ### 綜合測試 接下來,我們展示如何在 Python 包中運行測試。 ```py setup.py utils │ algo.py │ srel.py │ __init__.py │ └───tests algo_test.py srel_test.py __init__.py ``` 我們有這種包裝布局。 測試與包一起位于`tests`子目錄中。 `setup.py` ```py #!/usr/bin/env python3 from setuptools import setup, find_packages setup(name="utils", packages=find_packages()) ``` 這是`setup.py`。 `utils/algo.py` ```py def sel_sort(data): if not isinstance(data, list): vals = list(data) else: vals = data size = len(vals) for i in range(0, size): for j in range(i+1, size): if vals[j] < vals[i]: _min = vals[j] vals[j] = vals[i] vals[i] = _min return vals def max(values): _max = values[0] for val in values: if val > _max: _max = val return _max def min(values): _min = values[0] for val in values: if val < _min: _min = val return _min ``` 這是`algo.py`文件。 `utils/srel.py` ```py def is_palindrome(val): return val == val[::-1] ``` 我們還有另一個模塊,其中包含一個測試單詞是否為回文的函數。 `tests/algo_test.py` ```py #!/usr/bin/env python3 import utils.algo import pytest @pytest.fixture def data(): return [3, 2, 1, 5, -3, 2, 0, -2, 11, 9] def test_sel_sort(data): sorted_vals = utils.algo.sel_sort(data) assert sorted_vals == sorted(data) def test_min(): values = (2, 3, 1, 4, 6) val = utils.algo.min(values) assert val == 1 def test_max(): values = (2, 3, 1, 4, 6) val = utils.algo.max(values) assert val == 6 ``` 這些是`utils.algo`模塊的測試。 注意,我們使用完整的模塊名稱。 `tests/srel_test.py` ```py #!/usr/bin/env python3 import utils.srel import pytest @pytest.mark.parametrize("word, expected", [('kayak', True), ('civic', True), ('forest', False)]) def test_palindrome(word, expected): val = utils.srel.is_palindrome(word) assert val == expected ``` 這是對`is_palindrome()`函數的測試。 `utils/__init__.py` `utils/tests/__init__.py` 兩個`__init__.py`文件均為空。 ```py $ pytest --pyargs utils ================================================= test session starts ================================================= platform win32 -- Python 3.7.0, pytest-5.0.1, py-1.8.0, pluggy-0.12.0 rootdir: C:\Users\Jano\Documents\pyprogs\pytest\structure collected 6 items utils\tests\algo_test.py ... [ 50%] utils\tests\srel_test.py ... [100%] ============================================== 6 passed in 0.06 seconds =============================================== ``` 我們使用`pytest --pyargs utils`命令運行測試。 ### 外部測試 下一個示例顯示了應用源布局,其中測試未集成在包內。 ```py setup.py src └───utils │ algo.py │ srel.py tests algo_test.py srel_test.py ``` 在這種布局中,我們在源代碼樹之外進行測試。 請注意,不需要`__init__.py`文件。 ```py $ set PYTHONPATH=src $ pytest ``` 我們設置`PYTHONPATH`并運行 Pytest。 在本教程中,我們介紹了 Python Pytest 庫。 您可能也對以下相關教程感興趣: [Django 電子郵件教程](/django/email/), [Python Jinja 教程](/python/jinja/)和 [Python 教程](/lang/python/),或列出[所有 Python 教程](/all/#python)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看