【问题标题】:Why can this test methods only run in separate classes?为什么这个测试方法只能在单独的类中运行?
【发布时间】:2020-12-11 14:25:45
【问题描述】:

在名为 gui.py 的文件中测试非常简单:

    def getInputs():
        a = int(input("Enter Liters : "))
        b = int(input("Enter Persons: "))

典型的东西,比如正数,没有字符等。 现在有运行的测试用例,例如:

import gui      # The code to test
import unittest   # The test framework
from unittest.mock import patch

class Test_guiInputs1(unittest.TestCase):
       
    @patch('builtins.input')
    
    def test_getInputs1(self, mock_input):
        mock_input.side_effect = [20, 2]
        tuple = (20, 2)
        self.assertEqual(gui.getInputs(), tuple)

class Test_guiInputs2(unittest.TestCase):
    
    @patch('builtins.input')
    
    def test_getInputs(self, mock_input):
        mock_input.side_effect = [-20, 2]
        tuple = (-20, 2)
        self.assertEqual(gui.getInputs(), tuple)

现在有 2 个用 1 个方法分类,因为我没有设法在第一个类中输入第二种方法。我想知道模拟函数是否需要重新初始化。 像这样的所有方法...

class Test_guiInputs3(unittest.TestCase):
       
    @patch('builtins.input')
    
    def test_getInputs1(self, mock_input):
        mock_input.side_effect = [-20, 2]
        tuple = (-20, 2)
        self.assertEqual(gui.getsome(), tuple)

    def test_getInputs2(self, mock_input2):
        mock_input2.side_effect = [-20, 2]
        tuple2 = (-20, 2)
        self.assertEqual(gui.getsome(), tuple2)

...导致第二种方法的测试结果失败。第一个在 VSC 中获得绿旗(如预期的那样)。第二个 - 即使与第一个测试用例的值相同。 有谁知道出了什么问题? (Python 3.7.1、VSC、Windows 10 Pro 以防这对于任何已知版本特定的错误都很重要。)

【问题讨论】:

  • 基于测试方法,我假设getInputs实际上返回(a, b)?

标签: python unit-testing testing mocking


【解决方案1】:

装饰器语法仅适用于紧随其后的定义。

@foo
def bar():
    ...

等价于

def bar():
   ...

bar = foo(bar)

你只是在装饰第一个方法,不管装饰器和函数之间有多少空格。你需要装饰这两个方法。

class Test_guiInputs3(unittest.TestCase):
       
    @patch('builtins.input')
    def test_getInputs1(self, mock_input):
        mock_input.side_effect = [-20, 2]
        tuple = (-20, 2)
        self.assertEqual(gui.getsome(), tuple)

    @patch('builtins.input')
    def test_getInputs2(self, mock_input2):
        mock_input2.side_effect = [-20, 2]
        tuple2 = (-20, 2)
        self.assertEqual(gui.getsome(), tuple2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多