繁体   English   中英

如何在 Python Idle 中运行单元测试?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM