精华内容
下载资源
问答
  • Web基础(三)Python Web

    千次阅读 多人点赞 2018-11-14 19:11:49
    文章目录Python Web基础1. WSGI1.1 概述1.2 实现原理1、WSGI Server/gateway2、WSGI Application3、WSGI MiddleWare1.3 测试 WSGI服务器代码简析1.4 实现WSGI服务器1.5 生产环境中的Web服务器[Gunicorn]...

    Python Web基础

    在这里插入图片描述

    Web应用的本质:
    1. 浏览器发送一个HTTP请求
    2. 服务器收到请求,生成一个HTML文档
    3. 服务器把HTML文档作为HTTP响应的Body发送给浏览器
    4. 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示

    所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。我们上两篇博客已经详细讲解并实现了这样的HTTP服务器zjhttp,除此外Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。

    如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。

    1. WSGI

    Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

    以前,如何选择合适的Web应用程序框架成为困扰Python初学者的一个问题,这是因为,一般而言,Web应用框架的选择将限制可用的Web服务器的选择,反之亦然。那时的Python应用程序通常是为CGI,FastCGI,mod_python中的一个而设计,甚至是为特定Web服务器的自定义的API接口而设计的。

    WSGI(有时发音作’wiz-gee’)是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提升可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。WSGI没有官方的实现, 因为WSGI更像一个协议。只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。WSGI就是Python的CGI包装,相对于Fastcgi是PHP的CGI包装

    1.1 概述

    WSGI区分为两个部分
    1. 为“服务器”或“网关”。它用于接收、整理客户端发送的请求
    2. 为“应用程序”或“应用框架”。处理服务器程序传递过来的请求

    在这里插入图片描述

    如上图,Web服务器即第一部分,接收、整理客户端发送的请求,咱们前两篇博客使用C语言实现的zjhttp就是属于Web服务器部分;Web框架即为第二部分,即所谓的Web应用程序。开发Web应用程序的时候,通常会把常用的功能封装起来,成为各种框架,比如Flask,Django,Tornado(使用某框架进行web开发,相当于开发服务端的应用程序,处理后台逻辑)。但是,服务器程序和应用程序互相配合才能给用户提供服务,而不同应用程序(不同框架)会有不同的函数、功能。 此时,我们就需要一个标准,让服务器程序和应用程序都支持这个标准,那么,二者就能很好的配合了,这个标准就是 WSGI

    在处理一个WSGI请求时,服务器会为应用程序提供环境信息及一个回调函数(Callback Function)。当应用程序完成处理请求后,透过前述的回调函数,将结果回传给服务器。

    所谓的 WSGI 中间件同时实现了API的两方,因此可以在WSGI服务器和WSGI应用之间起调解作用。从Web服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:
    1. 重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。
    2. 允许在一个进程中同时运行多个应用程序或应用框架。
    3. 负载均衡和远程处理,通过在网络上转发请求和响应消息。
    4. 进行内容后处理,例如应用XSLT样式表。

    1.2 实现原理

    WSGI 将 Web 组件分为三类

    • web服务器
    • web中间件
    • web应用程序

    wsgi基本处理模式为:
    WSGI Server -> WSGI Middleware -> WSGI Application

    1、WSGI Server/gateway

    wsgi server可以理解为一个符合wsgi规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。以python自带的wsgiref为例,wsgiref是按照wsgi规范实现的一个简单wsgi server。它的代码不复杂。

    在这里插入图片描述

    1. 服务器创建socket,监听端口,等待客户端连接。
    2. 当有请求来时,服务器解析客户端信息放到环境变量environ中,并调用绑定的handler来处理请求。
    3. handler解析这个http请求,将请求信息例如method,path等放到environ中。
    4. wsgi handler再将一些服务器端信息也放到environ中,最后服务器信息,客户端信息,本次请求信息全部都保存到了环境变量environ中。
    5. wsgi handler 调用注册的wsgi app,并将environ和回调函数传给wsgi app
    6. wsgi app 将reponse header/status/body 回传给wsgi handler
    7. 最终handler还是通过socket将response信息塞回给客户端。

    2、WSGI Application

    wsgi application就是一个普通的callable对象,当有请求到来时,wsgi server会调用这个wsgi app。这个对象接收两个参数,通常为environ,start_response。environ就像前面介绍的,可以理解为环境变量,跟一次请求相关的所有信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,wsgi application通过调用start_response,将response headers/status 返回给wsgi server。此外这个wsgi app会return 一个iterator对象 ,这个iterator就是response body。这么空讲感觉很虚,对着下面这个简单的例子看就明白很多了。

    3、WSGI MiddleWare

    有些功能可能介于服务器程序和应用程序之间,例如,服务器拿到了客户端请求的URL, 不同的URL需要交由不同的函数处理,这个功能叫做 URL Routing,这个功能就可以放在二者中间实现,这个中间层就是 middleware。middleware对服务器程序和应用是透明的,也就是说,服务器程序以为它就是应用程序,而应用程序以为它就是服务器。这就告诉我们,middleware需要把自己伪装成一个服务器,接受应用程序,调用它,同时middleware还需要把自己伪装成一个应用程序,传给服务器程序。

    论是服务器程序、middleware 还是应用程序,都在服务端,为客户端提供服务,之所以把他们抽象成不同层,就是为了控制复杂度,使得每一次都不太复杂,各司其职。

    1.3 测试 WSGI服务器

    原理说得太多未免过于抽象,现在使用Python内置的纯Python代码编写的wsgiref服务器来体验一把WSGI服务器是如何工作的

    • 编写hello.py 作为一个Web应用程序

      def application(environ, start_response):
          start_response('200 OK', [('Content-Type', 'text/html')])
          return [b'<h1>Hello, World!</h1>']
      
    • 编写server.py作为一个WSGI服务器

      from wsgiref.simple_server import make_server
      # 导入编写的application函数
      from hello import application
      
      # 创建一个服务器,IP地址为空,端口是8000,传入函数application
      httpd = make_server('', 8000, application)
      print('Serving HTTP on port 8000...')
      # 开始监听HTTP请求:
      httpd.serve_forever()
      
    • 启动WSGI服务器

      python server.py
      
    • 使用客户端访问
      打开浏览器,输入http://localhost:8000/ ,在浏览器正常显示“Hello, World!”

    在这里插入图片描述

    代码简析

    上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

    • environ:一个包含所有HTTP请求信息的dict对象
    • start_response:一个发送HTTP响应的函数

    而在application()函数中又调用了start_response函数

    该函数发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()函数。start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个strtuple表示。

    通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。然后,函数的返回值b'<h1>Hello, web!</h1>'将作为HTTP响应的Body发送给浏览器。

    有了WSGI,我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML,通过start_response()发送Header,最后返回Body。

    整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,我们只负责在更高层次上考虑如何响应请求就可以了。

    需要注意的是,application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。但是我们仅将内置的wsgiref服务器用于测试,使我们编写的Web应用程序立马跑起来。

    1.4 实现WSGI服务器

    为了了解wsgi的工作原理,我们可以参照wsgiref源码,使用Python简单实现一个WSGI服务器

    import socket
    import StringIO
    import sys
    
    class WSGIServer(object):
    
        address_family = socket.AF_INET
        socket_type = socket.SOCK_STREAM
        request_queue_size = 1
    
        def __init__(self, server_address):
            # 创建socket,利用socket获取客户端的请求
            self.listen_socket = listen_socket = socket.socket(self.address_family, self.socket_type)
            # 设置socket的工作模式
            listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            # 绑定socket地址
            listen_socket.bind(server_address)
            # socket active, 监听文件描述符
            listen_socket.listen(self.request_queue_size)
    
            # 获得serve的host name和port
            host, port = self.listen_socket.getsockname()[:2]
            self.server_name = socket.getfqdn(host)
            self.server_port = port
    
            self.headers_set = []
    
        def set_app(self, application):
            self.application = application 
    
        #启动WSGI server服务,不停的监听并获取socket数据。
        def serve_forever(self):
            listen_socket = self.listen_socket
            while True:
                self.client_connection, client_address = listen_socket.accept() #接受客户端请求
                #处理请求
                self.handle_one_request()
    
        def handle_one_request(self):
            self.request_data = request_data = self.client_connection.recv(1024)
            self.parse_request(request_data)
    
            # Construct environment dictionary using request data
            env = self.get_environ()
    
            #给flask\tornado传递两个参数,environ,start_response
            result = self.application(env, self.start_response)
            self.finish_response(result)
    
        #处理socket的http协议
        def parse_request(self, data):
            format_data = data.splitlines()
            if len(format_data):
                request_line = data.splitlines()[0]
                request_line = request_line.rstrip('\r\n')
                (self.request_method, self.path, self.request_version) = request_line.split() ## ['GET', '/', 'HTTP/1.1']
    
        # 获取environ数据并设置当前server的工作模式
        def get_environ(self):
            env = {}
            env['wsgi.version']      = (1, 0)
            env['wsgi.url_scheme']   = 'http'
            env['wsgi.input']        = StringIO.StringIO(self.request_data)
            env['wsgi.errors']       = sys.stderr
            env['wsgi.multithread']  = False
            env['wsgi.multiprocess'] = False
            env['wsgi.run_once']     = False
            # Required CGI variables
            env['REQUEST_METHOD']    = self.request_method    # GET
            env['PATH_INFO']         = self.path              # /hello
            env['SERVER_NAME']       = self.server_name       # localhost
            env['SERVER_PORT']       = str(self.server_port)  # 8888
            return env
    
        def start_response(self, status, response_headers, exc_info=None):
            server_headers = [('Date', 'Tue, 31 Mar 2015 12:54:48 GMT'), ('Server', 'WSGIServer 0.2')]
            self.headers_set = [status, response_headers + server_headers]
    
        #把application返回给WSGI的数据返回给客户端。
        def finish_response(self, result):
            try:
                status, response_headers = self.headers_set
                response = 'HTTP/1.1 {status}\r\n'.format(status=status)
                for header in response_headers:
                    response += '{0}: {1}\r\n'.format(*header)
                response += '\r\n'
                for data in result:
                    response += data
                self.client_connection.sendall(response)
                print(''.join(['> {line}\n'.format(line=line) for line in response.splitlines()]))
            finally:
                self.client_connection.close()
    
    SERVER_ADDRESS = (HOST, PORT) = '', 8888
    
    def make_server(server_address, application):
        server = WSGIServer(server_address)
        server.set_app(application)
        return server
    
    
    if __name__ == '__main__':
        if len(sys.argv) < 2:
            sys.exit('Provide a WSGI application object as module:callable')
        app_path = sys.argv[1]
        module, application = app_path.split(':') # 第一个参数是文件名,第二个参数时长文件内app的命名
        module = __import__(module)
        application = getattr(module, application) # getattr(object, name[, default]) -> value
        httpd = make_server(SERVER_ADDRESS, application)
        print('WSGIServer: Serving HTTP on port {port} ...\n'.format(port=PORT))
        httpd.serve_forever()
    
    

    1.5 生产环境中的Web服务器

    每个web框架都不是专注于实现服务器方面的,因此,在生产环境部署的时候,使用的服务器也不会简单的使用web框架自带的服务器,那么用于生产环境的服务器有哪些呢?

    Gunicorn

    Gunicorn(从Ruby下面的Unicorn得到的启发)应运而生:依赖Nginx的代理行为,同Nginx进行功能上的分离。由于不需要直接处理用户来的请求(都被Nginx先处理),Gunicorn不需要完成相关的功能,其内部逻辑非常简单:接受从Nginx来的动态请求,处理完之后返回给Nginx,由后者返回给用户。

    由于功能定位很明确,Gunicorn得以用纯Python开发:大大缩短了开发时间的同时,性能上也不会很掉链子。同时,它也可以配合Nginx的代理之外的别的Proxy模块工作,其配置也相应比较简单

    uWSGI

    使用C语言开发,和底层接触的更好,配置也比较方便,目前和gunicorn两个算是部署时的唯二之选。由于其可扩展的架构,它能够被无限制的扩展用来支持更多的平台和语言。目前,可以使用C,C++和Objective-C来编写插件

    uWSGI 既不使用wsgi协议也不用FastCGI协议,而是自创了一个uwsgi的协议,uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。据说该协议大约是fcgi协议的10倍那么快

    主要特点如下:

    • 超快的性能
    • 低内存占用(实测为apache2的mod_wsgi的一半左右)
    • 多app管理
    • 详尽的日志功能(可以用来分析app性能和瓶颈)
    • 高度可定制(内存大小限制,服务一定次数后重启等)

    uWSGI 服务器自己实现了基于uwsgi协议的server部分,因此我们只需要在uwsgi的配置文件中指定application的地址,uWSGI 就能直接和应用框架中的WSGI application通信

    bjoern

    是一个用C语言编写的,快速超轻量级的 Python WSGI服务器。
    它是最快速的,最小的并且是最轻量级的WSGI服务器。有以下特性:

    • 1000 行的C代码
    • 占用内存 600KB
    • 单线程没有其他协同程序
    • 可以绑定到TCP主机:端口地址和Unix套接字
    • 支持HTTP1.0/1.1,包含支持HTTP1.1的分块响应

    如果单纯追求性能,那uWSGI会更好一点,而Gunicorn则会更易安装和结合gevent。在阻塞响应较多的情况下,Gunicorn的gevent模式无疑性能会更加强大。功能实现方面,uWSGI会更多一些,配置也会更加复杂一些。

    2. Web应用开发

    常见的Python Web应用框架:

    • Django:全能型Web框架
    • Flask:一个使用Python编写的轻量级Web框架
    • web.py:一个小巧的Web框架
    • Bottle:和Flask类似的Web框架
    • Tornado:Facebook的开源异步Web框架

    2.1 服务器架构

    在这里插入图片描述

    2.1.1 Nginx

    Nginx(发音同engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存。该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。

    Nginx是一款免费的开源软件,根据类BSD许可证的条款发布。一大部分Web服务器使用Nginx,通常作为负载均衡器。

    Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的Apache不同,Nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑从而削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。 在Linux操作系统下,Nginx使用epoll事件模型,得益于此,Nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。

    Nginx在官方测试的结果中,能够支持五万个并行连接,而在实际的运作中,可以支持二万至四万个并行连接

    反向代理

    在这里插入图片描述

    正向代理是指浏览器主动请求代理服务器,代理服务器转发请求到对应的目标服务器。而反向代理则部署在Web服务器上,代理所有外部网络对内部网络的访问。浏览器访问服务器,必须经过这个代理,是被动的。正向代理的主动方是客户端,反向代理的主动方是Web服务器

    在Python的Web开发中,较为成熟稳定的服务器架构一般是Nginx + uWSGI + Django。而实际上Nginx服务器并不是必须的,直接使用uWSGI + Djang完全是可以的,但这样一来,直接将uWSGI服务器暴露给了浏览器客户端,由此会导致诸多隐患。

    Nginx的优势
    1. 安全问题。客户端对Web服务器的访问需要先经过反向代理服务器,Nginx则只需开放某个接口,uWSGI本身是内网接口,这样可以防止外部程序对Web服务器的直接攻击。
    2. 负载均衡。反向代理服务器可以根据Web服务器的负载情况,动态地把HTTP请求交给不同的Web服务器来处理,前提是要有多个Web服务器。
    3. 提升Web服务器的IO性能。一个HTTP请求的数据,从客户端传输给服务器,是需要时间的,例如N秒,如果直接传给Web服务器,Web服务器就需要让一个进程阻塞N秒,来接收IO,这样会降低Web服务器的性能。如果使用Nginx作为反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提升Web服务器的性能。将静态资源发送(js、css、图片等)、动态请求转发以及结果的回复交给Nginx处理,就不需要经过Web服务器。

    附录

    支持WSGI的Web应用框架有很多

    • BlueBream
    • bobo
    • Bottle
    • CherryPy
    • Django
    • Flask
    • Google App Engine’s webapp2
    • Gunicorn
    • prestans
    • Pylons
    • Pyramid
    • restlite
    • Tornado
    • Trac
    • TurboGears
    • Uliweb
    • web.py
    • web2py
    • weblayer
    • Werkzeug

    参考

    [参考资料1]
    [参考资料2]
    [参考资料3]
    [参考资料4]
    [参考资料5]

    展开全文
  • Web端测试六大类型

    万次阅读 多人点赞 2018-10-11 17:14:30
    Web测试主要分为六个部分: 功能测试、性能测试、用户界面测试、兼容性测试、安全测试、接口测试 1、功能测试 1.1链接测试  链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的...

    Web测试主要分为六个部分:

    功能测试、性能测试、用户界面测试、兼容性测试、安全测试、接口测试

    1、功能测试

    1.1链接测试

          链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
          链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。

    1. 采取措施:采用自动检测网站链接的软件来进行。
    2. 推荐软件:
    3. Xenu Link Sleuth免费绿色免安装软件
    4. HTML Link Validator共享(30天试用)

    1.2表单测试

    当用户通过表单提交信息的时候,都希望表单能正常工作。

    如果使用表单来进行在线注册,要确保提交按钮能正常工作,当注册完成后应返回注册成功的消息。如果使用表单收集配送信息,应确保程序能够正确处理这些数据,最后能让顾客能让客户收到包裹。要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。

    当用户使用表单进行用户注册、登陆、信息提交等操作时,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。

    1.3数据校验

    如果系根据业务规则需要对用户输入进行校验,需要保证这些校验功能正常工作。例如,省份的字段可以用一个有效列表进行校验。在这种情况下,需要验证列表完整而且程序正确调用了该列表(例如在列表中添加一个测试值,确定系统能够接受这个测试值)

    在测试表单时,该项测试和表单测试可能会有一些重复。

    1.21.3的采取措施:第一个完整的版本采用手动检查,同时形成WinRunnerQTP)脚本;回归测试以及升级版本主要靠WinRunnerQTP)自动回放测试

    1.4 cookies测试

    Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。
      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。如果在cookies中保存了注册信息,请确认该cookie能够正常工作而且已对这些信息已经加密。如果使用cookie来统计次数,需要验证次数累计正确。

    采取措施:

    1采用黑盒测试:采用上面提到的方法进行测试

    2采用查看cookies的软件进行(初步的想法)

    可以选择采用的软件

    IECookiesView v1.50

    Cookies Manager v1.1

    1.5数据库测试

    Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。

    在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。

    采取措施:暂时没有更好的测试方法

    考虑结合到1.21.3的测试中

    1.6应用程序特定的功能需求

    最重要的是,测试人员需要对应用程序特定的功能需求进行验证。尝试用户可能进行的所有操作:下订单、更改订单、取消订单、核对订单状态、在货物发送之前更改送货信息、在线支付等等。这是用户之所以使用网站的原因,一定要确认网站能像广告宣传的那样神奇。

    采取措施:深刻理解需求说明文档

    1.7设计语言测试

    Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如JavaJavascrīptActiveXVBscrīptPerl等也要进行验证。

    暂时没有方法测试,可以多参考一点讨论组内的更新信息

    1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。

    2. 相关性检查:删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确。

    3. 检查按钮的功能是否正确:如update, cancel, delete, save等功能是否正确。

    4. 字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错.

    5. 字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错.

    6. 标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确.

    7. 中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错.

    8. 检查带出信息的完整性: 在查看信息和update信息时,查看所填写的信息是不是全部带出.,带出信息和添加的是否一致

    9. 信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.

    10. 检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,按”delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理.

    11. 检查添加和修改是否一致: 检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.

    12. 检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错.

    13. 重复提交表单:一条已经成功提交的纪录,back后再提交,看看系统是否做了处理。

    14. 检查多次使用back键的情况: 在有back的地方,back,回到原来页面,再back,重复多次,看会否出错.

    15. search检查: 在有search功能的地方输入系统存在和不存在的内容,看search结果是否正确.如果可以输入多个search条件,可以同时添加合理和不合理的条件,看系统处理是否正确.

    16. 输入信息位置: 注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方.

    17. 上传下载文件检查:上传下载文件的功能是否实现,上传文件是否能打开。对上传文件的格式有何规定,系统是否有解释信息,并检查系统是否能够做到。

    18. 必填项检查:应该填写的项没有填写时系统是否都做了处理,对必填项是否有提示信息,如在必填项前加*

    19. 快捷键检查:是否支持常用快捷键,如Ctrl+C Ctrl+V Backspace等,对一些不允许输入信息的字段,如选人,选日期对快捷方式是否也做了限制。

    20. 回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错.

     

    2、性能测试

     1.连接速度测试:测试页面链接的速度,系统需要重新登录的时间

     2.负载测试:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?

     3.压力测试:压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。

             压力测试的区域包括表单、登陆和其他信息传输页面等。

    3、用户界面测试

    1.导航测试:

    导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?51Testing软件测试网)cvpd+V W8A

    页面结构、导航、菜单、连接的风格是否一致
    2.  图形测试:

    1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。

    2)验证所有页面字体的风格是否一致。

    3)背景颜色应该与字体颜色和前景颜色相搭配。

    4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩,

    5)最后,需要验证的是文字回绕是否正确。如果说明文字指向右边的图片,应该确保该图片出现在右边。不要因为使用图片而使窗口和段落排列古怪或者出现孤行。

    3内容测试:检验Web应用系统提供信息的正确性、准确性和相关性。

    4.表格测试:用户是否需要向右滚动页面才能看见产品的价格?把价格放在左边,而把产品细节放在右边是否更有效? 每一栏的宽度是否足够宽,表格里的文字是否都有折行?是否有因为某一格的内容太多,而将整行的内容拉长?

    5.整体界面测试:界面测试主要从窗体及窗体中的控件两方面来考虑。

    4、 兼容性测试

    参考:http://www.cnblogs.com/haining1993/p/5193137.html

    1.平台测试:在各种操作系统下对Web系统进行兼容性测试。

    2.浏览器测试:创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

    3.分辨率测试:页面版式在不同的分辨率模式下是否显示正常? 字体是否太小以至于无法浏览? 或者是太大? 文本和图片是否对齐?

    4.连接速率:

    5.打印机测试:需要验证网页打印是否正常。有时在屏幕上显示的图片和文本的对齐方式可能与打印出来的东西不一样。测试人员至少需要验证订单确认页面打印是正常的。51Testing软件测试网8S2W*F:H4e4P7T

    6.组合测试:根据实际情况,采取等价划分的方法,列出兼容性矩阵

    5、安全测试

    1.目录设置:Web 安全的第一步就是正确设置目录。每个目录下应该有 index.html 或 main.html 页面,这样就不会显示该目录下的所有内容。

    2. SSL:如果开发部门使用了SSL,测试人员需要确定是否有相应的替代页面(适用于3.0 以下版本的浏览器,这些浏览器不支持SSL。当用户进入或离开安全站点的时候,请确认有相应的提示信息。是否有连接时间限制?超过限制时间后出现什么情况?

    3.登录:用户登录是否有次数限制? 是否限制从某些 IP 地址登录? 如果允许登录失败的次数为3,你在第三次登录的时候输入正确的用户名和口令,能通过验证吗? 口令选择有规则限制吗?  是否可以不登陆而直接浏览某个页面?
    HuK ]D2?1G-L }8n*N352621Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。

    4.日志文件:日志是否记所有的事务处理? 是否记录失败的注册企图? 是否记录被盗信用卡的使用? 是否在每次事务完成的时候都进行保存? 记录IP 地址吗? 记录用户名吗?

    5.脚本语言:测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。

    6.接口测试

    1.服务器接口:浏览器与服务器的接口。测试人员提交事务,然后查看服务器记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。

    2.外部接口: 测试的时候,要使用 web 接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。

    通常,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。

    3.错误处理:尝试在处理过程中中断事务,看看会发生什么情况?订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?

    采取措施:在理解需求的基础上,充分发挥想象力,尽量比较全面的列出各种异常情况。

    展开全文
  • web前端数据类型详解

    千次阅读 2019-04-11 14:50:33
    ECMAScript 有 5 原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。 typeof typeof 运算符有一个参数,即要检查的变量或值。例如: ``` var sTemp = "test st...

    数据类型

    数据类型

    JavaScript 拥有动态类型:字符串、数字、布尔、数组、对象、Null、Undefined

    ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。

    typeof

    typeof 运算符有一个参数,即要检查的变量或值。例如:

    ```
    	var sTemp = "test string";
    	alert (typeof sTemp);    //输出 "string"
    	alert (typeof 86);    //输出 "number"
    	对变量或值调用 typeof 运算符将返回下列值之一:
    
    ```
    
    • undefined - 如果变量是 Undefined 类型的
    • boolean - 如果变量是 Boolean 类型的
    • number - 如果变量是 Number 类型的
    • string - 如果变量是 String 类型的
    • object - 如果变量是一种引用类型或 Null 类型的

    注释:您也许会问,为什么 typeof 运算符对于 null 值会返回 “Object”。这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。

    Undefined 类型

    如前所述,Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。

    ```	
    	var oTemp;
    
    ```
    

    前面一行代码声明变量 oTemp,没有初始值。该变量将被赋予值 undefined,即 undefined 类型的字面量。可以用下面的代码段测试该变量的值是否等于 undefined:

    ```
    	var oTemp;
    	alert(oTemp == undefined);
    ```
    

    这段代码将显示 “true”,说明这两个值确实相等。还可以用 typeof 运算符显示该变量的值是 undefined:

    ```
    	var oTemp;
    	alert(typeof oTemp); //输出 "undefined"
    ```
    

    提示:值 undefined 并不同于未定义的值。但是,typeof 运算符并不真正区分这两种值。考虑下面的代码:

    ```
    	var oTemp;
    	
    	alert(typeof oTemp);  //输出 "undefined"
    	alert(typeof oTemp2);  //输出 "undefined"
    ```
    

    前面的代码对两个变量输出的都是 “undefined”,即使只有变量 oTemp2 从未被声明过。如果对 oTemp2 使用除 typeof 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。

    例如,下面的代码将引发错误:

    ```
    	var oTemp;
    	alert(oTemp2 == undefined);
    ```
    

    当函数无明确返回值时,返回的也是值 “undefined”,如下所示:

    ```
    	function testFunc() {
    	}
    	
    	alert(testFunc() == undefined);  //输出 "true"
    
    ```
    

    Null 类型

    另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

    ```
    	alert(null == undefined);  //输出 "true"
    ```
    

    尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

    展开全文
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    在前两种格式中,会将<来源>复制至<目的地>或将多个<来源>文件复制至已存在的<目录>,同时设定权限模式及所有者/所属组。在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也...
  • JavaWeb项目中WEB-INF的目录

    千次阅读 2018-06-20 20:54:20
    WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录(来自百度百科)。有时候,为了安全,可能需要把jsp文件放在WEB-INF目录下。我们可通过下面个方法来实现访问jsp文件: ...

    WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。(来自百度百科)
    有时候,为了安全,可能需要把jsp文件放在WEB-INF目录下。我们可通过下面两个方法来实现访问jsp文件:

    1. 通过配置文件对要访问的文件进行相应映射才能访问。
      如:通过配置web.xml的servlet映射访问jsp文件、springMVC的配置文件中配置资源映射。
    2. 通过后台服务器的代码进行转发。
      我们知道,实现页面的跳转有两种方式,一种是通过redirect的方式,一种是通过forward的方式。redirect方式的跳转,系统会在一个新的页面打开要跳转的网页;而forward方式跳转,系统会在原来的页面上打开一个要跳转的网页。所以放到WEB-INF目录下的文件是不允许采用redirect方式的跳转来访问的。所有在js中或者html的标签或者后台重定向的方式都不能访问到WEB_INF下的jsp文件。
      想详细了解的可以查看这篇文章:http://ykyfendou.iteye.com/blog/2094317
    展开全文
  • 概述现在的web框架可以分为基于请求的(request-based)和基于组件的(component-based)大阵营。前者的代表有Struts和Spring MVC等,后者的成员则有JSF、Tapestry、ASP.NET等等。基于请求的框架较早出现,它用以...
  • 这是作者的系列网络安全...本文将分析Python攻防之构建Web目录扫描器,实现IP代理池。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和ichunqiu的课程,同时也结合了作者之前的编程经验进行讲解。
  • C# web api返回类型设置为json的两种方法 web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法:  方法一:(改配置法)  找到Global.asax...
  • Java 学习路线

    万次阅读 多人点赞 2018-01-06 13:21:35
    对于入门java将近年的时间,曾经迷惘过,一直想知道java的具体学习路线,看过了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,发现没有一个符合我个人需求的学习路线,根据个人实际的...
  • 在Servlet2.5规范之前,Java Web应用的绝大部分组件都通过web.xml文件来配置管理。 Servlet3.0规范可通过Annotation来配置管理Web组件,因此web.xml文件可以变得更加简洁,这也是Servlet3.0的重要简化。 所以说,...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
  • 前端面试题集锦——前言

    万次阅读 多人点赞 2018-12-02 20:37:54
    web前端开发面试遇到的题目 web前端经典面试题 【前端】前端面试题整理 web前端开发面试题-基础篇 2018最新Web前端经典面试试题及答案-史上最全前端面试题(含答案) 前端面试题汇总 笔试题 2018最新Web前端经典面试...
  • Web服务器,C/S B/S两种架构模式

    千次阅读 2019-02-26 17:23:14
    Web服务器 ... Apache:Apache基金会提供,处理静态页面效率高 ... Jboss:开源,重量级服务器,Sun公司认准的J2EE...C/S B/S两种架构模式   动态网页技术 CGI:(共用网关接口)早期技术,编程复杂,维护困难 ASP...
  • 服务的三种类型

    千次阅读 2019-08-04 20:29:07
    一般认为服务有以下三主要的表现类型: 1. 工具服务 工具服务(Utility Service)代表可重用服务,区别业务模型。作为应用程序与技术基础设施之间的交叉点,工具服务的特点是业务领域无关,本质是面向技术、具备...
  • web网页开发

    万次阅读 多人点赞 2018-09-19 11:08:22
    这里主要总结,web网页的开发,即我们经常所看见的淘宝,新闻等网页。我们将一个所见的网页中每次刷新不变的部分,称为静态。这些静态由HTML和CSS组成,他们形成了网页的样式。HTML是一标记语言,用来结构化我们的...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...
  • Sping提供了两种类型的 IOC 容器实现.

    千次阅读 2016-12-02 10:20:28
    在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前,...Spring 提供了两种类型的 IOC 容器实现. BeanFactory: IOC 容器的基本实现. ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口. 使用场景:
  • 12开源Web安全扫描程序

    万次阅读 2017-11-24 09:38:27
    开源Web安全扫描程序来查找漏洞 赛门铁克的一个有趣的报告显示,76%的被扫描网站有恶意软件 如果您使用的是WordPress,那么SUCURI的另一份报告显示,超过70%的被扫描网站被感染了一个或多个漏洞。 作为网络应用...
  • ETH:Windows搭建ETH利用Web端和小程序端两种方式调用ETH上的SC智能合约 目录 1、Geth安装、配置文件、与ETH节点交互 1.1、下载并安装好geth客户端 1.2、配置好genesis.json文件 1.3 、命令进行初始化文件 ...
  • 比如在web表单的开发过程中 一个url针对的是一个web表单页面,那么,第一次访问应用时,他使用的是get请求!!只有当用户填完表单并符合要求提交时候,才是POST请求 这个非常重要!! 如下图,如果第一次访问程序...
  • 初学JavaWeb需要知道的目录结构与配置

    万次阅读 多人点赞 2017-02-22 17:48:00
    初学JavaWeb需要知道的目录结构与配置JavaWeb目录结构 ...WebContent(WebRoot):存放的是需要部署到服务器的文件MEAT-INF:是存放工程自身相关的一些信息,元文件信息,通常由开发工具和环境自动生成。MANI
  • web常用的三图像格式

    千次阅读 2017-05-14 19:48:32
    已经有很多大牛详细的整理过三图片格式的内容了,现在仅对三种web图片存储格式做一个简单归纳如下: 一、JPEG 适用于:照片和复杂图像使用 特点: 1.适合连续色调图像,如照片。  2.可以表示包含多达1600万
  • SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式。JSP+JavaBean开发模式jsp+javabean开发模式架构jsp+javabean开发模式的架构图如下图所示...
  • 常见web 容器比较

    万次阅读 2018-10-25 22:32:08
    web 容器比较 tomcat jboss resin weblogic websphere glassfish Tomcat是Apache鼎力支持的Java Web应用服务器,由于它优秀的稳定性以及丰富的文档资料,广泛的使用人群,从而在开源领域受到最广泛的青睐。- ...
  • 本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案。开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集,这种文章...
  • Tomcat是一个被广泛使用的Java WEB应用服务器,下面将认识Tomcat:先来...再来了解Tomcat的安装目录结构、Tomcat配置文件、Tomcat部署Web应用程序的目录结构;最后了解Tomcat基本架构、以及Tomcat各组件的一些配置。
  • 什么是HTTP协议? 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守
  •  应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览 器端/服务器端应用程序,这类应用程序一般借助浏览器来运行。  Web应用程序一般是B/S模式。Web应用程序...
  • 用集合接收参数分为两种:第一种是直接用一个集合类型来接收,第二种是在一个实体类中包含集合类型的参数 这里我会分别将这两种情况用代码实现下,例子使用springboot框架。 第一种:后端直接用集合类型来接收参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 721,443
精华内容 288,577
关键字:

web目录的两种类型