单元测试在Python IDE PyCharm中失败

Unittest failed in Python IDE PyCharm

我试图用Python做一个简单的单元测试,但我不知道测试失败的原因。
我做了三个文件:

  • name_function.py,其中我有一个函数接收两个参数(名字,姓氏)并返回连接名称。
1
2
3
        def get_formatted_name(first, last):
            full_name = first + ' ' + last
            return full_name.title()
  • names.py,其中要求用户输入名字和姓氏,或q要退出。之后调用函数get_formatted_name并打印连接名称。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        from name_function import get_formatted_name

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

        formatted_name = get_formatted_name(first, last)
        print("
\t Neatly formatted name :"
+ formatted_name + '.')
  • test_name_function.py测试函数的位置。
1
2
3
4
5
6
7
8
9
        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


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

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

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


这是因为假设您在交互式解释器上运行,并且在异常时它使用SystemExit失败。但是,就像在@Zykerd的评论中提到的那样

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

上面将通过假设从命令行而不是交互式解释器运行脚本来解决此问题。

干杯!

请在此处查看进一步说明:测试成功,仍然可以追溯


既然你专门询问PyCharm,那么这就是你所需要的:

  • 从单元测试文件中删除最后一行:unittest.main()
  • 或者做@Zykerd的建议然后把它变成

这个:

1
2
if __name__ == '__main__':
    unittest.main()
  • 在PyCharm中右键单击测试并选择Run Unittests in test_name_function

两者都工作(即没有调用main,或者主要名称后面的调用检查。