[英]How to run Unit Test in Python Idle?
我为我的单词出现 Gui 项目创建了一个 python 单元测试,我想测试前 5 个单词的出现,所以它应该返回一个真值但是我不知道如何运行单元测试? 我正在尝试使用空闲的 shell 但我应该使用 Visual Studio 命令提示符还是我的单元测试设置不正确? 如果您需要它来完成任务,我将显示下面的代码:
#Imports
import tkinter as tk
from tkinter import *
from tkinter import filedialog
from collections import Counter
from tkinter import messagebox
import collections
import unittest
# Initialize the dictionary
wordcount = {}
#Unit Test
class TestWordCount(unittest.TestCase):
def test_count_words(self):
n_print = 5
expected_result = {
'the' : 731,
'and' : 565,
'to' : 379,
'of' : 342,
'i' : 313
}
counter = n_print(int)
result = counter.count_words()
assert len(result) == len(expected_result)
assert result == expected_result
unittest.Word_Occurence_GUI().run(TestWordCount())
#open Macbeth text file
file = open('Macbeth Entire Play.txt', encoding="utf8")
a= file.read()
class Application(tk.Frame):
def __init__(self, master):
super().__init__() # Call __init__() method in parent (tk.Frame)
self.label = tk.Button(self, text='How many words to Sort?', command=self.ask_count)
self.label.grid(row=0)
self.open_btn = tk.Button(text='Compute', command=self.ask_count)
self.open_btn.pack(pady=(30,10))
self.exit_btn = tk.Button(text='Exit', command=master.destroy)
self.exit_btn.pack()
def ask_count(self):
with open('Macbeth Entire Play.txt', encoding="utf8") as file:
self.file_text = file.read()
for word in a.lower().split():
word = word.replace(".","")
word = word.replace(",","")
word = word.replace(":","")
word = word.replace("\"","")
word = word.replace("!","")
word = word.replace("“","")
word = word.replace("‘","")
word = word.replace("*","")
if word not in wordcount:
wordcount[word] = 1
else:
wordcount[word] += 1
n_print = int(input("How many most common words are: "))
print("\nThe {} most common words are as follows\n".format(n_print))
word_counter = collections.Counter(wordcount)
for word, count in word_counter.most_common(n_print):
print(word, ": ", count)
messagebox.showinfo("Top words...", "The top words are: \n" + "\n".join([(str(word)+": "+str(count)) for word, count in word_counter.most_common(n_print)]))
# Close the file
file.close()
messagebox.showinfo("The top words are: ")
if __name__ == '__main__':
root = tk.Tk()
root.title("Count words")
root.geometry('400x400+900+50')
app = Application(root)
app.pack(expand=True, fill='both')
root.mainloop()
#run unit test
unittest.main()
免责声明:这不能回答您的问题。 这只是一个示例,说明如何以编程方式而不是从命令行使用unittest
模块并捕获其 output(尽管不是来自 IDLE 和/或作为 Tkinter 应用程序的一部分)。 但是,在您的 Tkinter 应用程序中,这两件事(从另一个 it 运行测试并捕获结果)都是必需的。)
正在测试的代码做了几件事与您的问题非常相似。
也就是说,以两种不同的方式计算文本文件中的单词——实际上涉及两个单独的测试——一种使用collections.Counter
字典子类,另一种对相同的事情执行“手动”。 然后将每个结果与预期结果进行比较。
这是用于测试的非常简单的测试文件的内容:
Here's one line
And another line
And another line make three
这是代码:
import collections
from io import StringIO
import unittest
class TestWordCounts(unittest.TestCase):
TEST_FILENAME = './sample_e_input.txt'
EXPECTED_RESULT = {"heres": 1,
'one': 1,
'line': 3,
'and': 2,
'another': 2,
'make': 1,
'three': 1}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.get_text()
def test_collections_counter(self):
''' Count words collections.Counter. '''
counter = collections.Counter((word for word in self.clean_text.split()))
self.assertEqual(len(counter), len(self.EXPECTED_RESULT))
self.assertEqual(counter, self.EXPECTED_RESULT)
print('test_collections_counter passed')
def test_manual_count(self):
''' Count words manually. '''
word_counts = self.count_words(self.clean_text)
self.assertEqual(len(word_counts), len(self.EXPECTED_RESULT))
self.assertEqual(word_counts, self.EXPECTED_RESULT)
print('test_manual_count passed')
def get_text(self):
''' Read test file then convert to lowercase and remove punctuation. '''
with open(self.TEST_FILENAME, encoding="utf8") as file:
text = file.read()
cleaned = text.lower()
for substring in '. , : " \' ! *'.split():
cleaned = cleaned.replace(substring, "")
self.clean_text = cleaned
def count_words(self, file_text):
wordcount = collections.defaultdict(int)
for word in file_text.split():
wordcount[word] += 1
return dict(wordcount)
if __name__ == '__main__':
# Run unit test, capture output, and then print it.
output = StringIO()
tests = unittest.TestLoader().loadTestsFromTestCase(TestWordCounts)
test_result = unittest.TextTestRunner(stream=output).run(tests)
print(output.getvalue()) # Print captured output from running test.
Output 印刷:
test_collections_counter passed
test_manual_count passed
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.