簡體   English   中英

如何執行功能測試以驗證當一個函數運行時,另一個函數返回我需要的值 pytest

[英]how can I perform a functional test to verify that when a function is run, another function returns the value I need pytest

我有這個我無法更改的類我想編寫一個測試來顯示 check_len_color 函數返回所需的顏色但它不應該是單元測試應該是正常

class CheckQr:
    def __init__(self):
        self.color = None
        self.check_out = lambda exp, callback: callback if exp else lambda: None

    def check_in_db(self, qr):
        raise ConnectionError

    def check_len_color(self, qr):
        color = {
            3: 'Red',
            5: 'Green',
            7: 'Fuzzy Wuzzy'
        }
        self.color = color.get(len(qr))
        return self.color

    def scan_check_out_list(self, qr):
        return [
            self.check_out(not self.check_len_color(qr), lambda: [
                self.send_error(f"Error: Wrong qr length {len(qr)}")
            ]
                     ),
            self.check_out(not self.check_in_db(qr), lambda: [
                self.send_error("Not in DB")
            ]
                     )
        ]

    def check_scanned_device(self, qr: str):
        for func in self.scan_check_out_list(qr):
            if func():
                return
        message = f"hallelujah {qr}"
        self.can_add_device(message)

    @staticmethod
    def can_add_device(message: str):
        return message

    @staticmethod
    def send_error(error: str):
        return error

如何斷言該函數返回所需的顏色而不直接調用它? 我用 moker 模擬連接到數據庫。

import pytest
from scanner_handle import CheckQr


@pytest.fixture
def checkqr():
    checkqr = CheckQr()
    return checkqr


def test_check_color(mocker, checkqr):
    color_red = 'Red'
    color_green = 'Green'
    color_fuzzy_wuzzy = 'seven_c'

    mocker.patch(
        'scanner_handle.CheckQr.check_in_db',
        return_value=True
    )

    assert checkqr.check_scanned_device(color_red) == color_red
    assert checkqr.check_scanned_device(color_green) == color_green
    assert checkqr.check_scanned_device(color_fuzzy_wuzzy) == color_fuzzy_wuzzy


def test_check_color_not_exist(mocker, checkqr):
    color_not_exist = 'not_exist'

    mocker.patch(
        'scanner_handle.CheckQr.check_in_db',
        return_value=True
    )

    assert checkqr.check_scanned_device(color_not_exist) == True

check_scanned_device函數從不返回值(您可以通過查看代碼並注意沒有返回值的任何return語句來判斷),因此如果它應該返回值並且您無法修改/修復代碼,它從根本上被破壞了,寫一個針對它的測試是沒有意義的。 除非您修補該函數本身,否則無法讓您的測試驗證它是否返回一個值。

from unittest import mock

from scanner_handle import CheckQr


def test_check_color():
    checkqr = CheckQr()
    colors = [
        'Red',
        'Green',
        'seven_c',
    ]

    with mock.patch.object(
        checkqr,
        'check_scanned_device',
        new=lambda x: x
    ):
        for color in colors:
            assert checkqr.check_scanned_device(color) == color

def test_check_color_not_exist():
    checkqr = CheckQr()

    with mock.patch.object(
        checkqr,
        'check_scanned_device'
    ) as check_scanned_device:
        check_scanned_device.return_value = True
        assert checkqr.check_scanned_device('not_exist') == True

這當然是一個實際上並沒有測試任何東西的測試。 您可以使用上面顯示的相同mock.patch.object技術來修補check_in_db以用於其他測試,如果代碼中有任何運行良好的東西可以編寫測試。

如果您只想為check_len_color編寫測試,那會簡單得多,甚至不需要patch

from scanner_handle import CheckQr

def test_check_color():
    for color, result in [
        ('Red', 'Red'),
        ('Green', 'Green'),
        ('seven_c', 'Fuzzy Wuzzy'),
        ('not_exist', None),
    ]:
        assert CheckQr().check_len_color(color) == result

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM