马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
写在前面
这本书是我们老板保举过的,我在《代价心法》的保举书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开辟工程师来说,什么才更有代价呢?怎样让 AI 工具更好地辅助本身写代码,大概优质的单位测试是一个切入点。就我个人而言,这本书确实很有资助。第一次读的时间,很多细节我都不太懂,但将书中内容应用到工作中后,我受益匪浅。比如面对一些让人抓狂的代码操持时,书里的方法能让我渐渐深入明确代码的逻辑与操持。作为一名测试开辟工程师,我想把学习这本书的履历分享给各人,渴望能给各人带来资助。由于如今工作中大多利用 Python 代码,以是我把书中JAVA案例都用 Python 代码举行了改写 。 在软件开辟范畴,测试驱动开辟(TDD)是保障代码质量的有用实践,xUnit作为TDD常用的测试框架眷属,蕴含着丰富的逻辑与应用代价。接下来,我们通过更完备的代码示例深入分析其工作原理。
测试驱动开辟工具的独特性
利用测试工具自身运行测试来驱动开辟,犹如给本身实行风雅的外科手术,这正是xUnit测试框架的特殊之处。在缺乏现成完善框架的情况下,开辟者需切身验证每一步开辟,确保代码符合预期。
代码示例
- class WasRun:
- def __init__(self, name):
- self.wasRun = None
- self.name = name
- def setup(self):
- self.wasRun = 0
- print("setup")
- def testMethod(self):
- print("testMethod")
- self.wasRun = 1
- def teardown(self):
- print("teardown")
- class TestCase:
- def __init__(self, name):
- self.name = name
- def setUp(self):
- pass
- def tearDown(self):
- pass
- def run(self, result=None):
- if result is None:
- result = TestResult()
- result.testStarted()
- self.setUp()
- try:
- method = getattr(self, self.name)
- method()
- except:
- result.testFailed()
- self.tearDown()
- return result
- class TestResult:
- def __init__(self):
- self.runCount = 0
- self.errorCount = 0
- def testStarted(self):
- self.runCount = self.runCount + 1
- def testFailed(self):
- self.errorCount = self.errorCount + 1
- def summary(self):
- return "%d run, %d failed" % (self.runCount, self.errorCount)
- class TestCaseTest(TestCase):
- def setUp(self):
- self.result = TestResult()
- def testTemplateMethod(self):
- test = WasRun("testMethod")
- test.run(self.result)
- assert ("setup testMethod teardown" == test.log)
- def testResult(self):
- test = WasRun("testMethod")
- test.run(self.result)
- assert ("1 run, 0 failed" == self.result.summary())
- def testFailedResult(self):
- test = WasRun("testMethod")
- test.testMethod = lambda: 1 / 0
- test.run(self.result)
- assert ("1 run, 1 failed" == self.result.summary())
- def testFailedResultFormatting(self):
- result = TestResult()
- result.testStarted()
- result.testFailed()
- assert ("1 run, 1 failed" == result.summary())
- if __name__ == "__main__":
- suite = TestCaseTest("testTemplateMethod")
- result = suite.run()
- print(result.summary())
复制代码 代码逻辑推理
WasRun类
- 初始化:__init__方法设置wasRun属性为None,记载测试方法是否被运行,同时生存测试方法名称。
- setup方法:将wasRun设置为0,代表测试开始前的初始状态,并打印"setup",模拟测试前的预备工作。
- testMethod方法:打印"testMethod",代表测试方法的实验逻辑,并将wasRun设置为1,标识测试方法已被实验。
- teardown方法:打印"teardown",模拟测试后的整理工作。
TestCase类
- 初始化:__init__方法生存测试用例名称。
- setUp和tearDown方法:默认实现为空,可由子类重写以举行测试前预备和测试后整理。
- run方法:吸收一个TestResult对象(若未传入则创建新的),先调用testStarted方法标志测试开始,接着实验setUp,然后实验调用指定名称的测试方法,若方法实验中抛出非常则调用testFailed记载失败,末了实验tearDown,并返回TestResult对象。
TestResult类
- 初始化:设置runCount(测试运行次数)为0,errorCount(测试失败次数)为0。
- testStarted方法:每次测试开始时将runCount加1。
- testFailed方法:测试失败时将errorCount加1。
- summary方法:返回测试运行和失败次数的择要信息。
TestCaseTest类
继续自TestCase类,包罗多个测试方法:
- testTemplateMethod:测试TestCase类的模板方法逻辑,创建WasRun实例并运行测试,验证测试过程中的日记记载是否符合预期。
- testResult:验证TestResult类在正常测试情况下统计结果的正确性。
- testFailedResult:故意使测试方法抛出非常,验证TestResult类在测试失败时统计结果的正确性。
- testFailedResultFormatting:单独测试TestResult类在测试失败时择要信息的格式化是否正确。
在if __name__ == "__main__"块中,创建TestCaseTest实例并运行测试,打印测试结果择要。通过这些代码和逻辑,我们能清晰看到xUnit风格的测试框架怎样构造和运行测试用例,以及处置惩罚测试结果。
已完成与待完成事项
在之前的讨论中,我们明确了完满的测试框架包罗以下关键待服务项:
- Invoke setUp first:在测试实验前起首调用设置方法,用于初始化测试所需的情况、资源等,为测试的顺遂举行做好预备。
- Invoke tearDown afterwards:在测试竣事后调用整理方法,用于开释测试过程中占用的资源,如关闭文件、数据库毗连等,确保测试情况规复原状。
- Invoke tearDown even if the test method fails:纵然测试方法实验失败,也要调用整理方法,包管无论测试结果怎样,都能正确处置惩罚测试过程中产生的资源,维持测试情况的划一性和稳固性。
- Run multiple tests:具备运行多个测试的本领,可以或许将多个测试用例构造起来并依次实验,进步测试服从,满意项目中大量测试用例的实验需求。
- Report collected results:网络并陈诉测试结果,提供具体的测试信息,包罗哪些测试通过、哪些失败,以及失败的缘故原由等,资助开辟者快速定位息争决题目。
在当前的示例代码中,我们仅仅开端实现了部分底子功能:
- 创建测试用例类:界说了TestCase类,用于封装测试方法和相干的测试逻辑。
- 实现测试实验逻辑:在TestCase类中实现了run方法,可以或许实验单个测试方法,并在实验前后预留了setUp和tearDown方法的调用位置,不外如今这两个方法为空实现。
- 统计测试结果:创建了TestResult类,用于统计测试运行的次数和失败的次数,可以或许天生简单的测试结果择要。
- 测试功能验证:编写了TestCaseTest类,对TestCase和TestResult类的关键功能举行了简单的测试验证,确保根本的测试流程和结果统计功能正常。
下一章节,我们将聚焦于这些待完成事项,深入探究怎样在实际项目中进一步完满xUnit测试框架的应用,提拔测试服从和质量。
|