代码之家  ›  专栏  ›  技术社区  ›  Macha

我做这些单元测试对吗?

  •  2
  • Macha  · 技术社区  · 15 年前

    我对自己的项目的单元测试还不熟悉,所以这是我第一次尝试从头开始编写单元测试。我使用的是python和unittest模块。这里测试的todolist类是一个实际列表的包装器,有一些额外的方法,比如保存到光盘。它还定义了一些方法,通过列表中的ID获取项目(与列表索引不同)。

    测试(我删掉了一些辅助方法,为了不让人们永远滚动而删掉了一些测试):

    class TodoListTests(unittest.TestCase):
    
        def setUp(self):
            self.testdata = open("./testdata.json", "r")
            self.testdata_text = self.testdata.read()
            self.testdata.close()
    
        def tearDown(self):
            try:
                os.remove("./todo.json")
            except OSError:
                # File not created, no need to delete.
                pass
    
        def create_todolist_and_safe_list(self):
            self.create_data_file()
            self.todolist = todolist.TodoList("./todo.json")
            self.list = json.loads(self.testdata_text)
    
        def create_data_file(self):
            datafile = open("./todo.json", "w")
            datafile.write(self.testdata_text)
            datafile.close()
    
        # Snip out a few more helper methods
    
        def test_loop(self):
            self.create_todolist_and_safe_list()
            test_list = []
            for item in self.todolist:
            test_list.append(item)
    
            self.assertEquals(test_list, self.list)
    
    
        def test_save(self):    
            self.create_todolist_and_safe_list()
            self.todolist.save()
            newfile_text = self.get_data_file_as_string()
            self.assertEquals(newfile_text, self.testdata_text)
    
        # Snip out the rest of the tests.
    

    Full link to source

    2 回复  |  直到 15 年前
        1
  •  2
  •   Pedro Ghilardi    15 年前

    我认为你走对了。但我会提出一些建议;

    • 移动 self.testdata.close() setUp() tearDown() 功能。
    • 用try/finally块包围其他打开/关闭的块。因此,如果一个文件没有成功打开,它将被关闭。
    
        try:
            file.open()
        finally:
            file.close()
    
    
    • 更好地组织测试文件夹。我建议您创建一个名为 _tests 在这个文件夹中,您应该放置测试模块(在您的案例中,您只有一个模块)。然后,为每个模块创建一个具有模块名称的文件夹,并将模块测试使用的文件放在此文件夹中。

    要了解更多关于TDD和测试的信息,您应该阅读本书。 Test Driven Development: By Example

        2
  •  1
  •   Task    15 年前

    不,看起来不像你。 单元测试应该小、快、简单。 做“复杂”的测试(依赖外部数据库、文件系统、配置、环境的任何东西,或者测试本身和测试代码之外的任何东西)是有价值的,但不应该是“核心单元测试”的一部分。 单元测试应该验证代码是否符合规范。一个测试应该验证使用正确的输入可以获得预期的输出。应该存在另一个单元测试来验证错误输入的正确行为。对于不同类型的正确或不正确的输入,这经常重复,但是对于不正确的输入,通常有更多的测试。 但是,如果没有规范,您实际上没有太多的单元测试。 通常的问题是缺乏技术规范(spec),它告诉您正确或错误的输入是什么,以及在每种情况下应该做什么。

    不过,除了访问文件系统之外,您的测试看起来还不错。