我使用Python读取JSON文件并将每条记录转换为类实例。我已经有了一个示例JSON文件,但是对于Python代码,我第一次尝试使用测试驱动开发(TDD)方法。以下是我的(示例)JSON文件中的数据:
[{"Name": "Max", "Breed": "Poodle", "Color": "White", "Age": 8},
{"Name": "Jack", "Breed": "Corgi", "Color": "Black", "Age": 4},
{"Name": "Lucy", "Breed": "Labrador Retriever", "Color": "Brown", "Age": 2},
{"Name": "Bear", "Breed": "German Shepherd", "Color": "Brown", "Age": 6}]
我知道我想测试所有实例的每个参数中的有效条目。例如,我想根据可接受品种的元组检查品种,并检查年龄总是以整数形式给出。鉴于我完全缺乏TDD经验,我不清楚检查JSON导入代码产生的对象的代码是本身测试,还是我应该使用一组JSON测试导入代码和单独的集合来测试导入代码生成的实例。
答案 0 :(得分:0)
这是两个独立的实例。测试JSON负载与测试加载的json数据完全不同。加载数据不应该很复杂。 (json.loads)。但是如果你需要测试它,尽可能保持最小和细粒度。你的测试不应该相互影响。
通常,您的测试用例应该测试代码的非常特定部分。也就是说,它应该测试程序的特定功能。因为您提到验证加载的json数据(例如,繁殖),这意味着您的程序也应该具有此验证功能。对于这个例子,你会得到类似下面的测试用例。
import doggie
def test_validate_breed():
# Positive test case -- everything here should pass. (Assuming you give good data)
# your load_json routine itself could be a test. But generally this either works or
# it raises a json exception... At any rate, load_json returns a list of dictionaries
# like those you described above.
l = load_json()
for d in l:
assert doggie.validate_breed(d)
# Generate an invalid dictionary entry
d = { "Name": "Some Name", "Breed": "Invalid!", ... }
assert False == doggie.validate_breed(d)
def test_validate_age():
l = load_json()
for d in l:
assert doggie.validate_age(d)
# generate an invalid dictionary entry
d = { "Name": "Some Name", ... , "Age": 1000 }
assert False == doggie.validate_age(d)
测试之美在于它暴露了设计中的缺陷。它非常善于暴露不必要的耦合。
我建议你检查鼻子进行单元测试。它使运行测试变得简单,并提供了更好的实用功能,可以更好地描述测试失败。例如:
>>> import nose.tools as nt
>>> nt.assert_equal(4, 5)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\MSFBPY27\lib\unittest\case.py", line 509, in assertEqual
assertion_func(first, second, msg=msg)
File "C:\MSFBPY27\lib\unittest\case.py", line 502, in _baseAssertEqual
raise self.failureException(msg)
AssertionError: 4 != 5