繁体   English   中英

unittest - 如何测试函数中的内部参数?

[英]unittest - How to test internal parameter in a function?

我在为内部参数创建单元测试时遇到了一些问题。

我的结构是:

[1] my_animal.py 包含 Myclass 和方法:do_bite()

my_animal.py

class Myclass():
    def do_bite(self):
        return 1

[2] my_module.py 包含使用 my_animal.py 方法的 jobMain("")

my_module.py

import sys
from someclass import Myclass

def jobMain(directoryPath):
    flag = -1
    result = Myclass()

    if result.do_bite() is None:
        flag = 0
    if result.do_bite() is 1:
        flag = 1
    if result.do_bite() is 2:
        flag = 2

[3] my_test.py 包含用于在 my_module.py 中测试 jobMain 的单元测试

my_test.py

# Mock Myclass.dobite to None
@pytest.fixture
def mock_dobite0():
    with mock.patch('my_module.Myclass') as mocked_animal:
        mocked_animal.return_value.do_bite.return_value = None
        yield

# Mock Myclass.dobite to 1
@pytest.fixture
def mock_dobite1():
    with mock.patch('my_module.Myclass') as mocked_animal:
        mocked_animal.return_value.do_bite.return_value = 1
        yield

# Mock Myclass.dobite to 2
@pytest.fixture
def mock_dobite2():
    with mock.patch('my_module.Myclass') as mocked_animal:
        mocked_animal.return_value.do_bite.return_value = 2
        yield

# My unittest to test dobite() method
def test_dobite0(mock_Myclass, mock_dobite0):
   jobMain("")

def test_dobite1(mock_Myclass, mock_dobite1):
   jobMain("")

def test_dobite2(mock_Myclass, mock_dobite2):
   jobMain("")

我的问题是:如何在 JobMain 中测试“flag”参数? 'flag' para 必须被赋予正确的值。(例如:dobite = 1 => flag = 1)

变量para只存在于jobMain的范围内。 如果你想在jobMain之外使用变量,最常见的方法是

1) 返回值

这是很明显的。 由于 jobMain 是一个函数,它返回一个值。 如果没有明确的return语句,您将返回None 你可以


def jobmain(pth):
    # do stuff and assign flag
    return flag

# and inside tests
assert jobmain("") == 1

2)改用类

如果你想让 jobMain 记住一些状态,那么使用对象是一种常见的做法。 然后flag将是对象的属性,可以在调用JobMain任何方法(函数)后从外部访问。 例如

class JobMain:
    def __init__(self):
         self.flag = -1
    
    def run(self, pth):
        result = Myclass()
        if result.do_bite() is None:
            self.flag = 0
        if result.do_bite() is 1:
            self.flag = 1
        if result.do_bite() is 2:
            self.flag = 2

# and inside test
job = JobMain()
job.run()
assert job.flag == 1

笔记

我只是复制粘贴了您设置标志的代码。 请注意,如果结果值为None1 ,则多次调用do_bite() 此外,当针对一个数字进行测试时,应该使用==而不是is

如何在 JobMain 中测试“flag”参数?

你没有。 这是一个内部变量。 测试将是玻璃盒测试 如果实现发生变化,测试将中断。

相反,测试flag的效果。 这是黑盒测试 只测试接口。 如果实现发生变化,测试仍然有效,允许积极重构代码。


注意:如果你不硬编码result = Myclass()你不需要模拟。 将其作为参数传递,默认Myclass()

def jobMain(directoryPath, result=Myclass()):

那么你不需要修补Myclass() 相反,传入一个模拟对象。

# I don't know unittest.mock very well, but something like this.

mock = Mock(Myclass)
mock.do_bite.return_value = 2
jobMain('', result=mock)

这也使代码在测试之外更加灵活。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM