单元测试在Python IDE PyCharm中失败

时间:2019-02-26 21:44:31

标签: python python-3.x python-unittest

我试图用Python做一个简单的单元测试,但是我不知道测试为什么失败。 我已经制作了三个文件:

  • name_function.py ,其中有一个函数可以接收两个参数(名,姓)并返回串联的名称。
        def get_formatted_name(first, last):
            full_name = first + ' ' + last
            return full_name.title()
  • names.py ,要求用户输入名字和姓氏或 q 退出。之后,调用函数 get_formatted_name 并打印连接的名称。
        from name_function import get_formatted_name

        print("\n Enter 'q' at any time to quit.")
        while True:
            first = input("\n Please give me a first name : ")
            if first == 'q':
                break
            last = input("\n Please give me a second name : ")
            if last == 'q':
                break

        formatted_name = get_formatted_name(first, last)
        print("\n\t Neatly formatted name : " + formatted_name + '.')   
  • test_name_function.py 在哪里测试功能。
        import unittest  
        from name_function import get_formatted_name  

        class NamesTestCase(unittest.TestCase):  
            def test_first_last_name(self):  
                formatted_name = get_formatted_name('Clint', 'Eastwood')  
                self.assertEqual(formatted_name, 'Clint Eastwood')  

        unittest.main()  
  • 在此窗口中,我运行 cmd 命令(请参阅附件 Capture_1 )。
  • cmd 中运行命令(请参见 Capture_2 Capture_3 )。
  • 我不知道我的错误在哪里?在Capture_3中,查看运行测试后得到的结果。
  • 我使用Python 3.7.2,而我使用的IDE Python是PyCharm。

Capture_1 Capture_2 Capture_3

3 个答案:

答案 0 :(得分:1)

您的代码对我来说看起来不错。我在机器上运行它,效果很好。我唯一注意到的是python -m unittest找不到您的测试。一种快速的解决方法是在单元测试文件的末尾添加以下内容。

if __name__ == '__main__':
    unittest.main()

然后,可以使用以下命令运行它。 python test_name_function.py

答案 1 :(得分:0)

由于您是专门询问PyCharm的,因此您需要做的所有事情:

  • 从单元测试文件中删除最后一行:unittest.main()
  • 或按照@Zykerd的建议进行操作并将其变成

此:

if __name__ == '__main__':
    unittest.main()
  • 右键单击PyCharm中的测试,然后选择Run Unittests in test_name_function

两种方法都可以(即不调用main或在主体名称检查之后进行调用。

答案 2 :(得分:0)

这是因为假定您正在交互式解释器上运行,并且在发生异常时它会因SystemExit而失败。但是,就像@Zykerd在

的评论中提到的那样
if __name__ == '__main__':
    unittest.main()

通过假设脚本是从命令行而不是交互式解释器运行的,上述方法可以解决此问题。

干杯!

请在此处查看更多说明:Tests succeed, still get traceback