一套只守一条路的测试
(每道题开头都有同一段:被测的 clean(rows)(去空白、空数量当 0、整行去重、转不了的记行号)、静音的 run(),和造记录用的 row(store, qty)。)
下面这套测试只有「正常值」一条用例。对正确版本和一个去掉 strip 的变异版各跑一遍:
import io, unittest
def clean(rows):
good, bad, seen = [], [], set()
for i, r in enumerate(rows, 2):
r = {k: v.strip() for k, v in r.items()}
if r["qty"] == "":
r["qty"] = "0"
key = tuple(r.values())
if key in seen:
continue
seen.add(key)
try:
r["qty"] = int(r["qty"])
except ValueError:
bad.append(i)
continue
good.append(r)
return good, bad
def run(*cases):
suite = unittest.TestSuite()
for c in cases:
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(c))
r = unittest.TextTestRunner(stream=io.StringIO()).run(suite)
return str(r.testsRun) + "/" + str(len(r.failures)) + "/" + str(len(r.errors))
def row(store, qty):
return {"store": store, "qty": qty}
def clean_no_strip(rows):
good, bad, seen = [], [], set()
for i, r in enumerate(rows, 2):
if r["qty"] == "":
r = dict(r, qty="0")
key = tuple(r.values())
if key in seen:
continue
seen.add(key)
try:
r = dict(r, qty=int(r["qty"]))
except ValueError:
bad.append(i)
continue
good.append(r)
return good, bad
def clean_no_dedupe(rows):
good, bad = [], []
for i, r in enumerate(rows, 2):
r = {k: v.strip() for k, v in r.items()}
if r["qty"] == "":
r["qty"] = "0"
try:
r["qty"] = int(r["qty"])
except ValueError:
bad.append(i)
continue
good.append(r)
return good, bad
def clean_swallow(rows):
good, bad, seen = [], [], set()
for i, r in enumerate(rows, 2):
r = {k: v.strip() for k, v in r.items()}
if r["qty"] == "":
r["qty"] = "0"
key = tuple(r.values())
if key in seen:
continue
seen.add(key)
try:
r["qty"] = int(r["qty"])
except ValueError:
r["qty"] = 0
good.append(r)
return good, bad
def make(fn):
class T(unittest.TestCase):
def test_normal(self):
good, bad = fn([row("东门", "10")])
self.assertEqual(good[0]["qty"], 10)
return T
print(run(make(clean)) + "|" + run(make(clean_no_strip)))
全部评论