anu*_*alp 5 python python-unittest
我很难学习测试驱动的开发。
我正在编写一个类,它将采用文件名或文件描述并调整输入的大小并从文件中返回数据的大小块。
虽然首先开始测试,但我能想到的就是测试传递的参数是否不是 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()
Run Code Online (Sandbox Code Playgroud)
我在 stackoverflow 上经历了多个 TDD 问题和建议的教程,但看起来遵循 TDD 教程仍然很有趣,但实际上做 TDD 非常困难。我实际上可以想到我想在 ReadChunk 类中做什么,但就是无法真正找到测试然后编写代码。我能够考虑通过 TDD 检查传递的值是否是有效的文件对象,如果我在没有 TDD 的情况下进行编码,则不会发生这种情况,但我不确定我是否正确使用了单元测试。无法获得大图。任何人都可以请建议如何解决这个问题以及上面剪下的代码是否正确。
关于你的代码
setUp 和 tearDown 是可选方法,可帮助您设置和拆除测试环境。例如,它们通常用于创建和删除临时文件夹以存储输出或在测试期间设置(模拟)数据库连接。
它们不应用于测试任何功能。所以调用 FileChunk-object 不应该发生在 setUp 中。在每个测试中,您希望测试 FileChunk 中方法的某个特定情况,最好是彼此独立。因此,您应该在每个新案例中调用 FileChunk 的一个新实例。所以在这种情况下,test_instance_variables和test_check_if_instance_variables_are_valid_file_objects。
关于TDD
使用纯 TDD 是一种思维方式的改变。没有任何简单的教程可以帮助您。因为已经写了整本关于如何使用 TDD 的书。
但是,我可以为您提供一些指导方针。
在我看来,TDD 的一个重要方面是您不能只是开始进行测试。你真的应该知道这个类应该是什么样子的。
与 TemporaryFile() 不同,mkstemp() 的用户负责在使用完临时文件后将其删除。- Python 文档
所以删除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)
Run Code Online (Sandbox Code Playgroud)
等等,并为您计划实现的所有内容定义一个测试,实现它并运行测试。到目前为止,您的课程看起来不错,但正如您可能已经看到的那样,您应该尽可能具体地进行测试,例如使用
self.assertEqual(self.fc_obj.filename, self.fname)
Run Code Online (Sandbox Code Playgroud)
代替
self.assertIsNotNone(self.fc_obj.filename)
Run Code Online (Sandbox Code Playgroud)
如果您想对打开的 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):
#...
Run Code Online (Sandbox Code Playgroud)
如果您只想创建一次 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)
Run Code Online (Sandbox Code Playgroud)
并像测试方法中一样使用 self.fc_obj 。
| 归档时间: |
|
| 查看次数: |
17384 次 |
| 最近记录: |