测试是一个过程,在这个过程中,应用程序从不同的角度进行,以便-;
- Find the list of issues
- Find differences between the expected and actual result, output, states, etc.
- Understand the implementation phase.
- Find the application useful for realistic purposes.
测试的目标不是让开发人员犯错,而是提供工具并提高质量,以便在给定的时间估计应用程序的运行状况。
测试需要提前计划。这就要求定义测试的目的,理解测试用例的范围,列出业务需求,并意识到项目不同阶段所涉及的风险。
测试定义为一系列要在系统或应用程序上验证的方面。以下是常见测试方法的列表;
单元测试通常由开发人员自己执行。其目的是检查代码单元是否按预期工作。
可用性测试−开发人员通常会忘记他们正在为不了解系统的最终用户编写应用程序。可用性测试验证了产品的优缺点。
功能/验收测试−当可用性测试检查应用程序或系统是否可用时,功能测试确保每个指定的功能都已实现。
进行负载和性能测试−是为了了解系统是否能够适应要进行的负载和性能测试。这可能导致硬件更改、优化SQL查询等。
回归测试−它验证产品的连续发布不会破坏以前的任何功能。
可靠性和弹性测试&负;可靠性测试有助于在一个或多个组件出现故障时验证系统应用程序。
Unit Testing
Photoblog应用程序经常使用单元测试来检查以下各项;
- New functionalities work correctly and as expected.
- Existing functionalities are not broken by new code release.
- Defects are fixed and remain fixed.
Python附带了一个标准的unittest模块,提供了不同的单元测试方法。
Unittest
unit test源于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)
代码的解释如下所示;
应导入unit test模块,以便为给定类提供单元测试功能。
类应该通过子类unittest创建。
上面代码中的每个方法都以单词测试开始。所有这些方法都由unittest处理程序调用。
测试用例调用assert/fail方法来管理异常。
将此视为运行测试用例的一个示例−
if __name__ == '__main__': unittest.main()
运行测试用例的结果(输出)如下所示;
---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
Functional Testing
一旦应用程序功能按照需求开始成形,一组功能测试就可以验证应用程序关于规范的正确性。然而,测试应该自动化,以获得更好的性能,这将需要使用第三方产品,如硒。
CherryPy提供了类似helper类的内置函数,以简化函数测试的编写。
Load Testing
根据您正在编写的应用程序和您对卷的期望,您可能需要运行负载和性能测试,以便检测应用程序中阻止其达到某个性能级别的潜在瓶颈。
本节将不详细说明如何进行性能或负载测试,因为它不在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()
下面是对上述代码的详细解释;
测试用例必须继承自FunkLoad test case类,这样FunkLoad就可以完成跟踪测试期间发生的事情的内部工作。
类名很重要,因为FunkLoad将根据类名查找文件。
设计的测试用例可以直接访问配置文件。只需对服务器调用Get()和post()方法即可获得响应。