2010-01-21 59 views
2

我是新来的单元测试我自己的项目,所以这是我第一次尝试从头开始编写单元测试。我使用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

我认为你是以正确的方式进行。但我会提出一些建议;

  • self.testdata.close()setUp()移到tearDown()函数。
  • 用try/finally块围住其他人打开/关闭。所以,如果一个文件没有打开成功,它将被关闭。

    try: 
     file.open() 
    finally: 
     file.close() 

  • 更好地组织你的测试文件夹。我建议你创建一个名为_tests的文件夹,在这个文件夹中你应该放置测试模块(在你的情况下你只有一个模块)。然后,为每个模块创建一个带有模块名称的文件夹,并将模块测试使用的文件放入此文件夹中。

要了解更多关于TDD和测试,你应该阅读这本书Test Driven Development: By Example

1

不,它并不完全像你。单元测试应该小巧,快速并且简单。 做“复杂”测试(任何依赖于外部数据库,文件系统,配置,环境或测试本身之外的任何东西以及测试代码)是非常有价值的,但不应该是“核心单元”的一部分测试”。 单元测试应该验证代码是否符合规范。一个测试应该通过正确的输入来验证,你会得到预期的输出。应该存在另一个单元测试来验证错误输入的正确行为。对于不同类型的正确或不正确的输入,这通常会重复,但通常对于不正确输入的测试比任何测试都多。 不过,没有规范,你真的没有太多的单元测试。 通常的问题是缺乏技术规范(规范),告诉你什么是正确的或不正确的输入以及在每种情况下应该怎么做。

除了你敲击文件系统的事实,你的测试看起来不错。

相关问题