我很难学习测试驱动的开发。
我正在编写一个类,它将采用文件名或文件描述并调整输入大小,并从文件中返回大小的数据块。
在开始测试时,我首先要测试传递的参数是否为none,并检查参数是否为有效的文件对象。
我所能得到的只是代码,我是否应该使用setUp和tearDown方法,否则它是完全错误的?我正在创建一个临时文件和类的实例,定义为在setUp()中读取,我应该在tearDown()中删除对象
以下是代码
class Test_FileChunk(unittest.TestCase):
"""
"""
def setUp(self):
self.fhandle, self.fname = mkstemp()
self.fc_obj = FileChunk(filename=self.fname)
def tearDown(self):
try:
os.remove(self.fname)
except OSError as oserr:
print(oserr)
def test_instance_variables(self):
self.assertIsNotNone(self.fc_obj.filename)
self.assertIsNone(self.fc_obj.filehandle)
self.assertEqual(self.fc_obj.chunk_size, 8192)
def test_check_if_instance_variables_are_valid_file_objects(self):
handle = open(self.fc_obj.filename
self.assertEqual(
hasattr
(handle, "r"), 'seek'), True,
msg="Is not a valid file object")
handle.close()
我经历了关于stackoverflow的多个TDD问题并提出了教程,但是看起来跟TDD教程看起来很有意思,但实际上做TDD非常困难。我实际上可以想到我想在ReadChunk类中做什么,但实际上我无法先了解实际找到测试然后编写代码。我能够考虑检查传递的值是否是通过TDD的有效文件对象,如果我没有TDD编码就不会发生,但我不确定我是否正确使用unittest。无法得到全局。任何人都可以建议如何解决这个问题以及上面的代码是否正确。
答案 0 :(得分:4)
关于您的代码
setUp和tearDown是帮助您进行设置的可选方法..拆除测试环境。例如,它们通常用于创建和删除临时文件夹以存储输出或在测试期间设置(模拟)数据库连接。
不应使用它们测试任何功能。因此,调用FileChunk对象不应该在setUp中发生。在每个测试中,您希望在FileChunk中测试某些方法,理想情况下彼此独立。因此,您应该在每个新案例中调用FileChunk的新实例。所以在这种情况下, test_instance_variables 和 test_check_if_instance_variables_are_valid_file_objects 。
关于TDD
使用纯TDD是一种思维方式的改变。没有任何简单的教程可以为您提供帮助;因为整本书都是关于如何使用TDD的。
但是,我可以为您提供一些指导。
在我看来,TDD的一个重要方面是你不能开始进行测试。你应该真的知道这个类应该是什么样的。
答案 1 :(得分:1)
与TemporaryFile()不同,mkstemp()的用户负责在完成临时文件时删除它。 - Python Documentation
所以删除tearDown中的文件是正确的解决方案。
我个人会做一些像
这样的测试功能def test_filename(self):
self.assertEqual(self.fc_obj.filename, self.fname)
self.assertIsTrue(os.path.isfile(self.fc_obj.filename))
def test_handle(self):
self.assertIsNone(self.fc_obj.filehandle)
def open_file(self):
# if you implemented an "open" method
# you can use this method every time you test the opened file
result = self.fc_obj.open()
self.assertIsTrue(result, "File open failed")
self.assertIsNotNone(self.fc_obj.filehandle)
# if you plan to implement a read and a write method you can add the following test
def test_read_write_file(self):
self.open_file()
random_data = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N))
self.fc_obj.write(random_data)
self.assertEqual(self.fc_obj.read(), random_data)
依此类推,为您计划实施的所有内容定义测试,实施并运行测试。你的课程看起来很好,但是正如你可能已经看到的那样,你应该尽可能地使测试具体,例如使用
self.assertEqual(self.fc_obj.filename, self.fname)
而不是
self.assertIsNotNone(self.fc_obj.filename)
如果您想要使用打开的FileChunk对象进行大量测试,还可以添加第二个unittest.TestCase
。
class TestOpenFileChunk(unittest.TestCase);
def setUp(self):
self.fhandle, self.fname = mkstemp()
self.fc_obj = FileChunk(filename=self.fname)
self.fc_obj.open()
def tearDown(self):
# if you have this method
self.fc_object.close()
# and then
try:
os.remove(self.fname)
except OSError as why:
print(why)
def test_read_write(self):
#...
如果您只想创建FileChunk对象,也可以使用setUpClass
和tearDownClass
方法。
class TestOpenFileChunk(unittest.TestCase);
@classmethod
def setUpClass(cls):
cls.fhandle, cls.fname = mkstemp()
cls.fc_obj = FileChunk(filename=self.fname)
cls.fc_obj.open()
@classmethod
def tearDownClass(cls):
# if you have this method
cls.fc_obj.close()
# and then
try:
os.remove(cls.fname)
except OSError as why:
print(why)
并在测试方法中始终使用self.fc_obj。