第18章 走进xUnit:测试驱动开辟的关键工具

[复制链接]
发表于 2025-11-3 21:12:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
写在前面


这本书是我们老板保举过的,我在《代价心法》的保举书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开辟工程师来说,什么才更有代价呢?怎样让 AI 工具更好地辅助本身写代码,大概优质的单位测试是一个切入点。就我个人而言,这本书确实很有资助。第一次读的时间,很多细节我都不太懂,但将书中内容应用到工作中后,我受益匪浅。比如面对一些让人抓狂的代码操持时,书里的方法能让我渐渐深入明确代码的逻辑与操持。作为一名测试开辟工程师,我想把学习这本书的履历分享给各人,渴望能给各人带来资助。由于如今工作中大多利用 Python 代码,以是我把书中JAVA案例都用 Python 代码举行了改写 。
在软件开辟范畴,测试驱动开辟(TDD)是保障代码质量的有用实践,xUnit作为TDD常用的测试框架眷属,蕴含着丰富的逻辑与应用代价。接下来,我们通过更完备的代码示例深入分析其工作原理。
测试驱动开辟工具的独特性

利用测试工具自身运行测试来驱动开辟,犹如给本身实行风雅的外科手术,这正是xUnit测试框架的特殊之处。在缺乏现成完善框架的情况下,开辟者需切身验证每一步开辟,确保代码符合预期。
代码示例
  1. class WasRun:
  2.     def __init__(self, name):
  3.         self.wasRun = None
  4.         self.name = name
  5.     def setup(self):
  6.         self.wasRun = 0
  7.         print("setup")
  8.     def testMethod(self):
  9.         print("testMethod")
  10.         self.wasRun = 1
  11.     def teardown(self):
  12.         print("teardown")
  13. class TestCase:
  14.     def __init__(self, name):
  15.         self.name = name
  16.     def setUp(self):
  17.         pass
  18.     def tearDown(self):
  19.         pass
  20.     def run(self, result=None):
  21.         if result is None:
  22.             result = TestResult()
  23.         result.testStarted()
  24.         self.setUp()
  25.         try:
  26.             method = getattr(self, self.name)
  27.             method()
  28.         except:
  29.             result.testFailed()
  30.         self.tearDown()
  31.         return result
  32. class TestResult:
  33.     def __init__(self):
  34.         self.runCount = 0
  35.         self.errorCount = 0
  36.     def testStarted(self):
  37.         self.runCount = self.runCount + 1
  38.     def testFailed(self):
  39.         self.errorCount = self.errorCount + 1
  40.     def summary(self):
  41.         return "%d run, %d failed" % (self.runCount, self.errorCount)
  42. class TestCaseTest(TestCase):
  43.     def setUp(self):
  44.         self.result = TestResult()
  45.     def testTemplateMethod(self):
  46.         test = WasRun("testMethod")
  47.         test.run(self.result)
  48.         assert ("setup testMethod teardown" == test.log)
  49.     def testResult(self):
  50.         test = WasRun("testMethod")
  51.         test.run(self.result)
  52.         assert ("1 run, 0 failed" == self.result.summary())
  53.     def testFailedResult(self):
  54.         test = WasRun("testMethod")
  55.         test.testMethod = lambda: 1 / 0
  56.         test.run(self.result)
  57.         assert ("1 run, 1 failed" == self.result.summary())
  58.     def testFailedResultFormatting(self):
  59.         result = TestResult()
  60.         result.testStarted()
  61.         result.testFailed()
  62.         assert ("1 run, 1 failed" == result.summary())
  63. if __name__ == "__main__":
  64.     suite = TestCaseTest("testTemplateMethod")
  65.     result = suite.run()
  66.     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测试框架的应用,提拔测试服从和质量。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表