CherryPy - 测试
测试是从不同角度执行应用程序的过程,目的是−
- 查找问题列表
- 查找预期结果和实际结果、输出、状态等之间的差异。
- 了解实施阶段。
- 找到对实际目的有用的应用程序。
测试的目标不是让开发人员承担责任,而是提供工具并提高质量以估计应用程序在给定时间的健康状况。
测试需要提前计划。这要求定义测试的目的,了解测试用例的范围,列出业务需求并了解项目不同阶段所涉及的风险。
测试被定义为要在系统或应用程序上验证的一系列方面。以下是常见测试方法的列表 −
单元测试 − 这通常由开发人员自己执行。其目的是检查代码单元是否按预期工作。
可用性测试 − 开发人员通常会忘记他们正在为不了解系统的最终用户编写应用程序。可用性测试可验证产品的优缺点。
功能/验收测试 − 可用性测试检查应用程序或系统是否可用,而功能测试则确保实现了每个指定的功能。
负载和性能测试 − 执行此操作是为了了解系统是否可以适应要进行的负载和性能测试。这可能导致硬件发生变化、优化 SQL 查询等。
回归测试 − 它验证产品的后续版本不会破坏任何先前的功能。
可靠性和弹性测试 −可靠性测试有助于验证系统应用程序的一个或多个组件是否发生故障。
单元测试
Photoblog 应用程序不断使用单元测试来检查以下内容 −
- 新功能是否正常工作并符合预期。
- 新代码发布不会破坏现有功能。
- 缺陷已修复并保持修复状态。
Python 附带标准 unittest 模块,提供不同的单元测试方法。
Unittest
unittest 源于 JUnit,JUnit 是由 Kent Beck 和 Erich Gamma 开发的 Java 单元测试包。单元测试仅返回定义的数据。可以定义模拟对象。这些对象允许针对我们设计的接口进行测试,而无需依赖整个应用程序。它们还提供了一种在隔离模式下运行测试的方法,其中包含其他测试。
让我们以以下方式定义一个虚拟类 −
import unittest class DummyTest(unittest.TestCase): def test_01_forward(self): dummy = Dummy(right_boundary=3) self.assertEqual(dummy.forward(), 1) self.assertEqual(dummy.forward(), 2) self.assertEqual(dummy.forward(), 3) self.assertRaises(ValueError, dummy.forward) def test_02_backward(self): dummy = Dummy(left_boundary=-3, allow_negative=True) self.assertEqual(dummy.backward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.backward(), -3) self.assertRaises(ValueError, dummy.backward) def test_03_boundaries(self): dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True) self.assertEqual(dummy.backward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.forward(), -1) self.assertEqual(dummy.backward(), -2) self.assertEqual(dummy.backward(), -3)
代码说明如下 −
应导入 unittest 模块,为给定类提供单元测试功能。
应通过对 unittest 进行子类化来创建一个类。
上述代码中的每个方法都以单词 test 开头。所有这些方法均由 unittest 处理程序调用。
测试用例调用 assert/fail 方法来管理异常。
将此视为运行测试用例的示例 −
if __name__ == '__main__': unittest.main()
运行测试用例的结果(输出)如下 −
---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
功能测试
一旦应用程序功能开始按照要求成形,一组功能测试就可以验证应用程序是否符合规范。但是,测试应该自动化以获得更好的性能,这需要使用第三方产品,例如 Selenium。
CherryPy 提供辅助类,如内置函数,以简化功能测试的编写。
负载测试
根据您正在编写的应用程序和您对容量的期望,您可能需要运行负载和性能测试,以检测应用程序中阻止其达到一定性能水平的潜在瓶颈。
本节不会详细介绍如何进行性能或负载测试,因为它超出了 FunkLoad 包的范围。
FunkLoad 的最基本示例如下 −
from funkload.FunkLoadTestCase import FunkLoadTestCase class LoadHomePage(FunkLoadTestCase): def test_homepage(self): server_url = self.conf_get('main', 'url') nb_time = self.conf_getInt('test_homepage', 'nb_time') home_page = "%s/" % server_url for i in range(nb_time): self.logd('Try %i' % i) self.get(home_page, description='Get gome page') if __name__ in ('main', '__main__'): import unittest unittest.main()
以下是上述代码的详细说明 −
测试用例必须从 FunkLoadTestCase 类继承,以便 FunkLoad 可以执行其内部工作,即跟踪测试期间发生的情况。
类名很重要,因为 FunkLoad 将根据类名查找文件。
设计的测试用例可以直接访问配置文件。只需针对服务器调用 Get() 和 post() 方法即可获取响应。