自动化测试

最近在准备面试,职位是关于测试的,但其实我对测试这一方面了解的不多。所以我今天就乱七八糟地记录了我今天学的知识。

如果从整个系统开发,维护等完整阶段来分的话,测试一般可分为单元测试,集成测试,系统测试,验收测试,回归测试等几个方面。

下面的介绍摘自网上:

单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言, 一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。

单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。

系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。(常见的联调测试)

系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统设计。

验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。

回归测试:回归测试是在软件维护阶段,对软件进行修改之后进行的测试。其目的是检验对软件进行的修改是否正确。

测试还可以分为性能测试和功能测试。功能测试是对系统本身进行测试,比如Web应用,我对其进行功能上的验证;那性能测试是包括系统及依赖的系统环境进行测试。

性能测试可以分为:
基准测试:在给系统施加较低压力时,查看系统的运行状况并 记录 相关数做为基础参考
负载测试:是指对系统不断地增加压力或增加一定压力下的持续时间,直到系统的某项或多项性能指标达到安全临界值,例如某种资源已经达到饱和状态等 。
压力测试 :压力测试是评估系统处于或超过预期负载时系统的运行情况,关注点在于系统在峰值负载或超出最大载荷情况下的处理能力。
稳定性测试:在给系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定。
并发测试:测试多个用户同时访问同一个应用、同一个模块或者数据记录时是否存在死锁或者其他性能问题。
在实际工作中,我们对于测试这块都需要通过自动化测试实现。
自动化测试的流程:测试需求分析,测试设计(测试用例,数据准备),无人值守测试,测试报告,测试维护。
上面是整个自动化测试的一个工作流程,我们需要对每一阶段的测试都要进行上述的流程,对于上面提到的测试分类,自动化测试可分为单元测试,接口测试和UI测试。

说一下为什么要做接口测试:

1、什么是接口测试?

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。

2、为什么要做接口测试?

a) 如今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,接口测试可以提供这种情况下的解决方案。

b)  接口测试相对容易实现自动化持续集成,且相对UI自动化也比较稳定,可以减少人工回归测试人力成本与时间,缩短测试周期,支持后端快速发版需求。接口持续集成是为什么能低成本高收益的根源。

c)   现在很多系统前后端架构是分离的,从安全层面来说:

1、只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前面实在太容易), 需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。

2、前后端传输、日志打印等信息是否加密传输也是需要验证的,特别是涉及到用户的隐私信息,如身份证,银行卡等。

有一篇比较好的文章: 接口测试。

我刚开始看网上的资料,都把我看迷惑了,后来看也就是那么回事啊,接口测试不就是拿到开发的API接口,然后针对接口,进行功能测试啊。比如我的博客中开发了Django RESTFUL API,有get,post等不同的请求,我就根据你测试需求,编写测试用例和测试脚本,进行测试。

比如我们用一个自动化测试工具,selenium。我最早听说这个工具是我几年前写爬虫的时候,用它来模拟浏览器的访问,这样就可以访问异步加载的数据了。其实selenium用得最多的还是编写测试用例:

class UserTestCase(TestCase): 

  def test_users_by_selenium(self):
        driver = selenium.webdriver.Firefox()
        driver.get('/api/users')
        self.assertIn('REST',driver.title)

自动化测试的工具:

测试用例考虑条件:

1、基于用户的角度,针对不同功能需求进行编写;

2、基于系统的角度,从不同的逻辑层取编写,不如Django的MTV三个方面;

要考虑所有可能出现输入组合,考虑边界条件以及异常;

Python主要有单元测试和文档测试。

文档测试是以一种交互解释器的形式来测试,我们在语句定义下方编辑文档,可以利用doctest进行测试:


"""
test the function
>>> adds(1,2)
3
"""

def adds(a,b):
    """
    >>> adds(3, 4)
    7
    """
    return a+b


if __name__ == "__main__":    
    import doctest
    doctest.testmod(verbose=True)

文档字符串可以显著的告诉函数或类的使用者如何使用,其实我是觉得不灵活。Python中最常用的就是单元测试,内置unittest框架。

Django的测试更加好用,提供了很多的内置工具。

Django测试会单独创建测试数据库,以test开头,当测试结束后,会自动销毁数据库。

Client,可以测试视图,模拟get和post等请求;

from django.test import TestCase,Client
from models import UserProfile
from django.contrib.auth.models import User

class UserProfileTestCase(TestCase):

    def setUp(self):
        User.objects.create(username='test',password='test')
        self.user = User.objects.get(username='test')
        UserProfile.objects.create(age=28,
                                   user=self.user,
                                   birthday='1989-03-25')

    def test_userprofile_creation(self):
        self.assertTrue(UserProfile.exist_user_profile(self.user))



class UserViewTestCase(TestCase):

    def setUp(self):
        self.client = Client()

    def test_login(self):
       r = self.client.post('/account/login/',{'username':'hbnnlong','password':'NANAnana320'})
       self.assertEqual(r.status_code,200)
 

--------EOF---------
微信分享/微信扫码阅读