测试
测试是一个过程,在此过程中,应用程序从不同的角度进行,以便 -
- 找到问题列表
- 找出预期结果与实际结果,输出,状态等之间的差异。
- Understand the implementation phase.
- 找到对实际用途有用的应用程序。
测试的目的不是让开发人员犯错,而是提供工具并提高质量,以便在给定时间估计应用程序的运行状况。
测试需要提前计划。 这需要定义测试目的,理解测试用例的范围,制定业务需求列表以及了解项目不同阶段所涉及的风险。
测试被定义为要在系统或应用程序上验证的一系列方面。 以下列出了common test approaches -
Unit testing - 这通常由开发人员自己执行。 这旨在检查代码单元是否按预期工作。
Usability testing - 开发人员通常会忘记他们正在为不了解系统的最终用户编写应用程序。 可用性测试验证了产品的优缺点。
Functional/Acceptance testing - 可用性测试检查应用程序或系统是否可用,功能测试确保实现每个指定的功能。
Load and performance testing - 执行此操作是为了了解系统是否可以根据要进行的负载和性能测试进行调整。 这可能导致硬件更改,优化SQL查询等。
Regression testing - 它验证产品的连续版本不会破坏任何先前的功能。
Reliability and resilience testing - 可靠性测试有助于通过一个或多个组件的细分来验证系统应用程序。
单元测试 (Unit Testing)
Photoblog应用程序不断使用单元测试来检查以下内容 -
- 新功能正常运行并符合预期。
- 新代码版本不会破坏现有功能。
- 缺陷是固定的并保持固定。
Python带有标准的unittest模块,提供不同的单元测试方法。
Unittest
unittest植根于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
功能测试 (Functional Testing)
一旦应用程序功能按照要求开始成形,一组功能测试可以验证应用程序关于规范的正确性。 但是,测试应该是自动化的,以获得更好的性能,这需要使用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()方法即可获得响应。