[英]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
之外使用变量,最常见的方法是
这是很明显的。 由于 jobMain 是一个函数,它返回一个值。 如果没有明确的return
语句,您将返回None
。 你可以
def jobmain(pth):
# do stuff and assign flag
return flag
# and inside tests
assert jobmain("") == 1
如果你想让 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
我只是复制粘贴了您设置标志的代码。 请注意,如果结果值为None
或1
,则多次调用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.