2013-07-01 119 views
4

我有一个使用大量全局变量的程序,我希望为程序中的某些方法编写几个单元测试。为具有全局变量的方法创建单元测试

当我开始编写代码时,我对Python很陌生,现在意识到我应该一直在测试。有一些在程序中的方法如下:

class Wordnet(): 

    def __init__(self): 
     self.graph = Graph() 
     self.before_at = '' 
     self.after_at = '' 
     self.word_part = '' 
     self.gloss_part = '' 
     self.lex_filenum = '' 

    def process_file(self): 
     self.file = open("testing_line.txt", "r") 
     return self.file 

    def line_for_loop(self, file): 
     for line in file: 
      self.split_pointer_part(line) 
      self.split_word_part(line) 
      self.split_gloss_part(line) 
      self.process_lex_filenum(self.word_part) 

    def split_pointer_part(self, line): 
     self.before_at, self.after_at = line.split('@', 1) 
     return self.before_at, self.after_at  

    def split_word_part(self, line): 
     self.word_part = line.split() 
     return self.word_part 

    def split_gloss_part(self, line): 
     self.gloss_part = line.strip().split('|') 
     return self.gloss_part 

    def process_lex_filenum(self, word_part): 
     self.lex_filenum = word_part[1] 
     return self.lex_filenum 

if __name__ == '__main__': 
    wordnet = Wordnet() 
    my_file = wordnet.process_file() 
    wordnet.line_for_loop(my_file) 

什么是困惑我是如何变量通过向测试类和我如何去写的测试方法。到目前为止,这是我:

class WordnetTestCase(unittest.TestCase): 
    def setUp(self): 
     self.wn = wordnet.Wordnet() 
     self.graph = wordnet.Graph() 
     self.before_at = wordnet.before_at 
     self.after_at = wordnet.after_at 
     self.word_part = wordnet.word_part 
     self.gloss_part = wordnet.gloss_part 
     self.lex_filenum = wordnet.lex_filenum 

    def test_split_pointer_part(line): 
     expected = '13797906 23 n 04 flood 0 inundation 0 deluge 0 torrent 0 005',' 13796604 n 0000 + 00603894 a 0401 + 00753137 v 0302 + 01527311 v 0203 + 02361703 v 0101 | an overwhelming number or amount; "a flood of requests"; "a torrent of abuse"' 
     real = self.wn.split_pointer_part() 
     self.assertEqual(real, expected) 

if __name__ == '__main__': 
    unittest.main() 
    raw_input("Press <ENTER> to exit") 

这并不是目前的工作,我知道我没有做正确的方式,但就是无法找到这个问题的任何具体的帮助!

回答

3

这里是一个可运行的例子,让你开始:

import unittest 
class Wordnet(): 

    def __init__(self): 
     # self.graph = Graph() 
     self.before_at = '' 
     self.after_at = '' 
     self.word_part = '' 
     self.gloss_part = '' 
     self.lex_filenum = '' 

    def process_file(self): 
     self.file = open("testing_line.txt", "r") 
     return self.file 

    def line_for_loop(self, file): 
     for line in file: 
      self.split_pointer_part(line) 
      self.split_word_part(line) 
      self.split_gloss_part(line) 
      self.process_lex_filenum(self.word_part) 

    def split_pointer_part(self, line): 
     self.before_at, self.after_at = line.split('@', 1) 
     return self.before_at, self.after_at  

    def split_word_part(self, line): 
     self.word_part = line.split() 
     return self.word_part 

    def split_gloss_part(self, line): 
     self.gloss_part = line.strip().split('|') 
     return self.gloss_part 

    def process_lex_filenum(self, word_part): 
     self.lex_filenum = word_part[1] 
     return self.lex_filenum 


class WordnetTestCase(unittest.TestCase): 
    def setUp(self): 
     self.wn = Wordnet() 

    def test_split_pointer_part(self): 
     line = '[email protected]' 
     result = self.wn.split_pointer_part(line) 
     answer = ('foo', 'bar') 
     self.assertEqual(len(result), 2) 
     for r, a in zip(result, answer): 
      self.assertEqual(r, a) 

if __name__ == '__main__': 
    unittest.main() 
+0

可以在测试类在不同的文件中完成或者是很容易做的这种方式? – Johnnerz

+0

测试类应该位于不同的文件中;为了让这个例子更简单,我把它放在一起。 – unutbu