第四章 使用Setup和tear Down方法执行测试

单元测试实战

第四章 使用Setup和tear Down方法执行测试

示例:使用Setup和tear Down方法执行测试

以通常的方式执行新的单元测试。

  1. 在一直在使用的命名空间中打开终端。
  2. ^UnitTestRoot的值设置为包含测试类的目录的父级:
USER> Set ^UnitTestRoot="c:\unittests"
  1. 使用%UnitTest.Manager执行测试:
USER> Do ##class(%UnitTest.Manager).RunTest("mytests")
  1. IRIS加载测试类、编译类、执行测试并向终端发送报告。

===============================================================================
Directory: C:\unittests\mytests\cls\MyPackage\
===============================================================================
mytests\cls\MyPackage begins ...
Load of directory started on 01/09/2018 14:36:57 '*.xml;*.XML;*.cls;*.mac;*.int;*.inc;*.CLS;*.MAC;*.INT;*.INC'

Loading file C:\unittests\mytests\cls\MyPackage\Tests.xml as xml
Imported class: MyPackage.Tests

Compilation started on 01/09/2018 15:44:01 with qualifiers ''
Compiling class MyPackage.Tests
Compiling routine MyPackage.Tests.1
Compilation finished successfully in 0.033s.

Load finished successfully.
 
  MyPackage.Tests begins ...
      TestAdd() begins ...
        AssertEquals:Test Add(2,2)=4 (passed)
        AssertNotEquals:Test Add(2,2)'=5 (passed)
        LogMessage:Duration of execution: .000073 sec.
      TestAdd passed
      TestEditContact() begins ...
        AssertStatusNotOK:ContactType = Friend (passed)
        AssertStatusOK:ContactType = Personal (passed)
        LogMessage:Duration of execution: .001227 sec.
      TestEditContact passed
    MyPackage.Tests passed
  mytests\cls\MyPackage passed
 
Use the following URL to view the result:
http://10.0.75.1:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=10&$NAMESPACE=USER
All PASSED
 

执行测试的选项:测试规格和限定符

通常,可以使用以下形式的命令执行RunTest

Do ##class(%UnitTest.Manager).RunTest("testspec","qualifiers")

Testspec参数确定要运行哪些测试以及在哪里可以找到它们。Testspec的一般形式是testSuite:testcase:testmethod,其中

  • testsuite(必填)。包含导出的测试类的文件目录。该目录必须是名为^UnitTestRoot的目录的子目录。默认情况下,测试管理器执行此目录及其子目录中包含的所有文件中的所有测试。
  • testcase测试用例(可选)。选择包含要执行的测试方法的单个类。格式为PackageName.ClassName。如果存在,则测试管理器仅执行命名类中的测试。
  • testmethod(可选)。挑选由测试用例指示的测试类的一个方法来执行。

限定符参数指定用于运行测试的各种选项。正如我们已经看到的,当想要从.cls文件加载测试时,可以使用“/loadudl”限定符。还可以使用限定符来控制测试类在执行后是否从服务器中删除,是否应该从这些外部文件加载测试,或者系统是否应该在测试失败后进入调试模式,等等。限定符参数是一个可选的命令行参数字符串,用于打开或关闭某些测试管理器行为。例如,“/NoLoad/DEBUG”告诉管理器不要从目录加载任何测试,也就是说,使用当前在InterSystems IRIS中的测试,并在调试模式下运行测试。这些限定符就是所谓的可否定布尔值。例如,这意味着“/NoLoad”等同于“/Load=0”

限定符含义
/load (default)从目录加载测试。使用/NoLoad不加载测试,并执行InterSystems IRIS中已包含的测试。
/run (default)运行测试。使用/norun加载但不运行任何测试。
/delete (default)执行后从InterSystems IRIS中删除测试类。使用/nodelete保存类。
/recursive (default)在指定目录的子目录中查找测试。使用/norecsive不执行子目录中包含的测试。
/debug (default is /nodebug)使用/DEBUG,第一次测试失败后不会执行任何测试。从终端执行时,终端将在第一次故障后进入调试模式。
/autoload使用/autoload=dir^UnitTestRoot目录的子目录“dir”加载测试。
/loadudl.cls而不是XML文件加载测试。

RunTest 示例

以下是使用RunTest执行单元测试的一些示例。

要使用RunTest,必须首先为^UnitTestRoot分配一个有效的目录名:

USER>Set ^UnitTestRoot = "C:\UnitTests"

例1:

USER>Do ##class(%UnitTest.Manager).RunTest()

^UnitTestRoot目录的所有子目录中搜索包含测试类的XML文件。加载它找到的任何测试类并执行测试。

执行后从InterSystems IRIS中删除所有加载的测试类。

例2:

USER>Do ##class(%UnitTest.Manager).RunTest("mytests")
  • 加载并执行^UnitTestRootmytests子目录(及其子目录)中的测试。
  • 在测试类执行后从InterSystems IRIS中删除它们。

例3:

USER>Do ##class(%UnitTest.Manager).RunTest("mytests:MyPackage.Tests")
  • ^UnitTestRoot目录的mytest子目录(及其子目录)加载测试。仅执行MyPackage.Tests中的测试。
  • 执行测试后从InterSystems IRIS中删除所有测试类。

例4:

USER>Do ##class(%UnitTest.Manager).RunTest("mytests:MyPackage.Tests", "/noload/nodelete")
  • 不将测试加载到IRIS。
  • MyPackage.Tests中执行测试。请注意,mytest必须仍然包含带有MyPackage.Tests类的XML文件。
  • 不从IRIS中删除MyPackage.Tests

DebugRunTestCase

%UnitTest.Manager类还包含DebugRunTestCase方法。若要使用此方法,仍必须先将^UnitTestRoot分配给有效目录:

USER>Set ^UnitTestRoot="C:\UnitTests"

例如:

USER>Do ##class(%UnitTest.Manager).DebugRunTestCase("mytests","MyPackage.Tests","","")
  • 该方法不从任何目录加载任何类,也不从InterSystems IRIS删除任何类。
  • 该方法执行MyPackage.Tests中包含的测试。
  • 可选的第三个参数用于限定符。
  • 可选的第四个参数用于指定测试类中要执行的单个测试方法。
  • 如果测试失败,该方法将继续执行其余的测试方法,但将在测试完成时中断。因此,如果从终端执行,则终端将进入调试模式。

注意:使用DebugRunTestCase时,mytest目录实际上不需要包含MyPackage.Tests。相比之下,RunTest总是要求要执行的测试包含在^UnitTestRoot的子目录中,即使在使用NoLoad”时也是如此。

练习

练习1:MyPackage.TestMe包含一个名为CreateContact的方法。此方法创建并返回Contact实例。它接受NameContactType值作为参数。创建一个测试以下内容的单元测试:

  • CreateContact返回的Contact实例具有正确的Name值。
  • CreateContact返回的Contact实例具有正确的ContactType值。
  • CreateContact返回的Contact实例保存正确,即%Save返回OK状态。

练习2:MyPackage.Contact包含名为ByContactType的类查询。它返回具有ContactType指定值的所有Contact实例的ID值。将单元测试添加到MyPackages.Tests,用于测试以下各项:

  • 该查询返回指定ContactType的正确ID值数量。为此,必须正确初始化数据库。
  • 查询返回的每个ID值对应于一个具有指定ContactType值的联系人。

请注意,添加此测试不应破坏在完成教程正文中的示例时添加到MyPackage.Tests中的测试。因此,必须以正确的方式初始化和恢复数据库。

把答案发到评论上!!! 或加群QQ 410039091 分享

源码

在 Python 的单元测试中,`setup` `teardown` 是用于初始化清理测试环境的重要机制,它们确保测试代码的独立性可重复性。根据不同的测试框架,这些方法的具体实现使用方式有所区别。 ### `setup` `teardown` 的作用 `setup` 方法通常在每个测试方法执行之前被调用,用于准备测试所需的环境。例如,可以在这个方法中初始化对象、连接数据库或设置文件路径等操作。这样可以确保每个测试方法都能在一个已知的状态下运行,从而避免测试之间的相互影响。相对地,`teardown` 方法在每个测试方法执行之后被调用,用于清理测试环境。例如,可以在这个方法中关闭数据库连接、删除临时文件或释放其他资源。这种清理操作有助于防止资源泄漏,并确保后续测试执行不会受到之前测试的影响。 ### `setup` `teardown` 的区别 在 `unittest` 框架中,`setUp()` `tearDown()` 是测试类中的方法,它们分别在每个测试方法执行前后被调用。如果 `setUp()` 方法执行失败,则认为整个测试失败,所有测试方法都不会被执行,也不会调用 `tearDown()` 方法。此外,`unittest` 还提供了类级别的 `setUpClass()` `tearDownClass()` 方法,它们分别在测试类中的所有测试方法执行之前之后被调用。 在 `pytest` 框架中,`setup` `teardown` 的功能与 `unittest` 类似,但它们的命名方式有所不同。例如,`setup_method()` `teardown_method()` 的功能与 `setup()` `teardown()` 相同,但 `setup_method()` 会在 `setup()` 之前执行。`pytest` 还提供了类级别的 `setup_class()` `teardown_class()` 方法,它们分别在测试类中的所有测试方法执行之前之后被调用。此外,`pytest` 支持使用 `fixture` 来实现更灵活的 `setup` `teardown`,这允许开发者定义可重用的设置清理逻辑,并且可以在多个测试中共享。 ### 示例代码 以下是一个使用 `unittest` 框架的示例,展示了 `setUp()` `tearDown()` 方法使用: ```python import unittest class TestExample(unittest.TestCase): def setUp(self): # 初始化操作 self.resource = "Initialized Resource" print("Setup completed.") def tearDown(self): # 清理操作 self.resource = None print("Teardown completed.") def test_example(self): self.assertEqual(self.resource, "Initialized Resource") if __name__ == '__main__': unittest.main() ``` ### 注意事项 需要注意的是,在 `pytest` 中,`setup` `teardown` 的命名方式与 `unittest` 有所不同,其中 `setup` 的首字母是小写的,而 `tearDown` 的首字母也是小写的。这一细微的差别可能导致 `setup` `teardown` 方法没有被正确执行,因此在编写测试代码时需要特别注意这一点。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaoxin521123

谢谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值