银行软件测试:基于互联网金融平台的测试框架设计与分析

目前互联网金融火的一塌糊涂,基于互联网金融平台的自动化测试的项目也是如火如荼的进行。笔者手头上负责一个p2p项目的测试框架开发,因此如何设计一套有效的测试框架也成为工作所需和互相交流测试经验的必须。

这个网站的后台主要是php和java, 也就是说,一些基础的服务,如充值提现,投标起息还款,是采用spring mvc的框架来写的,然后php来调用java的API,java平台通过intercepter将php 传递过来的http请求映射到对应的controller,controller再通过map映射到对应的服务和实现。

简单来说网站框架就类似如下:
在这里插入图片描述

网站一些基本的业务如注册登录,用户中心,投资、红包等等由用户前台触发php调用,一些活动、红包、礼品券等等由后台触发php调用,充值提现投资起息还款由java平台实现。

基于这样的平台的自动化测试框架选型的时候,笔者考虑过以下几种:

一种是采用基于selenium,集成thinkphp的框架来写。主要的原理就是利用selenium的firefox插件来录制,页面上的html元素和javascript脚本,然后做2次封装将这些录取到的元素和js封装成一个个的标准对象,保存到标准对象库,然后再添加一些数据库的数据准备和数据清理函数,以及数据库增删改查语句。

然后在引擎脚本中,引用和调用这些对象的方法,类似如edit,type等等,然后就在页面跳转的时候加上驭循环和一些判断,检测页面元素的值是否存在,或者是检测一些方法返回值,或者是采用断言来处理数据库查询到的结果和页面上返回的结果做匹对,可以在以selenium为基本的框架的时候,引入thinkPHP或者YII框架加快开发脚本速度。

另外一种是采用QTP方式来使用,其基本原理也和采用selenium原理大同小异,唯一的差别就是QTP提供了一个很好和强大的基本类库,以及一个很好的对象识别机制obeject Spy,QTP的基本类库里面基本什么都有,java,.net, web,乃至于dephi……

在识别对象的时候可以直接通过java里面的类来映射,也可以直接用web相关类库里面的类,甚至是windows平台类……QTP提供了多种识别方式以帮助定位对象,这样只用修改少量的对象属性,在回放脚本和编辑核心代码的时候,就可以起到事半功倍的效果,但是QTP也有缺点,就是对于Js的处理不方便,还有就是时刻需要启动QTP,而不能和一些开源测试框架特别是java开源项目,来实现自动部署测试用例和自动打包的集成。

ruby +watir 的原理和selenium也是类似,也是一种基于WEB GUI的自动化测试框架,笔者研究甚少,也就不多言了。

但是由于p2p行业的特性,这些基于web的自动化测试框架有很多不适合的地方,跟投资充值提现相关的这些相关的功能,比较在乎的不仅仅是页面上的一些元素功能的显示,更关心的是这个数据的正确性。

如果采用基于GUI的方式做自动化测试,个人感觉针对页面元素的识别和校验往往并不能反映数据正确性,而在处理页面元素异常的时候,也往往无法针对复杂业务逻辑和数据做较强的处理和效益,而且GUI是模拟人工处理,在执行效率上面,也是效果较差,而且如果出现某个页面元素无法识别或者异常,有可能中断整个页面的处理,在分析代码覆盖率的时候,基于web的方式也不是那么容易分析。

目前的这个项目,java向PHP平台提供的主要是基于HTTP协议的restful应用,之所以采用restful,而不用webservice来处理传输数据相关,是因为webservice即便是采用json而不是xml来处理传输数据,相比较restful也显得较重,json还需要加密解密解析、序列化什么的,而在 restful 里面直接就可以通过 http 请求对资源进行操作。

因此笔者觉得还是从controller层直接进行接口测试比较直接有效,又考虑到 spring框架里面提供了mock http请求的方法,而web UI的正确性相对于后台业务数据正确性的优先级就没有那么高了,而spring的测试框架里面虽然可以通过断言controller层返回的ModleAndView对象校验controller的正确性,即通过接口测试来效益结果,但是如果controller层后面的对象 太多的话,一旦出现问题也不便于排错。

因此基本的测试框架思路就是采用spring mvc提供的mock restful的工具类,然后引入断言机制和数据库处理,来逐个controller分析业务逻辑的正确性和数据正确性。而sping MVC本身也提供了一套测试框架,可以通过服务端测试和客户端测试分别来测试。

服务端测试在使用spring mvc测试框架之前,可能采取类似如下代码:

  1. @Test

  2. public void serverSample() {

  3. MockHttpServletRequest request = new MockHttpServletRequest();

  4. ModelAndView mav = new sampleController.function(parameters);

  5. ModelAndViewAssert.assertViewName(mav, user/view);

  6. ModelAndViewAssert.assertModelAttributeAvailable(mv, user);

  7. }

  8. }

采用服务器端测试后,可以采用如下两种方法:

  1. standalone:

  2. public class ServerTest {

  3. @Autowired

  4. private MockMvc mockMvc;

  5. @Before

  6. public void init() {

  7. SampleController sample = new SampleController();

  8. mockMvc = MockMvcBuilders.standaloneSetup(SampleController).build();

  9. }

  10. }

  集成:

  1. public class ServerTest {

  2. @Autowired

  3. private WebApplicationContext wac;

  4. private MockMvc mockMvc;

  5. @Before

  6. public void init() {

  7. mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

  8. }

  9. }

 测试:

  1. @Test

  2. public void testSample() throws Exception {

  3. MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(/user/1))

  4. .andExpect(MockMvcResultMatchers.view().name(user/view))

  5. .andExpect(MockMvcResultMatchers.model().attributeExists(user))

  6. .andDo(MockMvcResultHandlers.print())

  7. .andReturn();

  8. Assert.assertNotNull(result.getModelAndView().getModel().get(user));

  9. }

以上是采用spring MVC的服务端测试方法,至于客户端则有几种方法,

1.通过jetty启动容器,真实映射到controller层实现;

2.使用spring boot测试

3.使用mock service server测试,第三种方式基本上属于使用resttemplate来测试客户端比较好的方法;

即先通过MockRestServiceServer创建RestTemplate的Mock Server,然后添加客户端请求断言,判断客户端请求的断言是否正确,3、添加服务端响应,检查服务器端相应是否正确。

客户端相关代码在网络上也有很多资源,因此也就不再赘叙,这里主要是提供一种基于spring mvc框架和基于restful应用如何测试controller层的思想。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/293941.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之调用Python

1、配置头文件 Python安装目录下的include目录加入头文件目录。Visual Studio2022中操作路径是:属性–> C/C -> 常规-> 附加包含目录 C:\Users \AppData\Local\Programs\Python\Python39\include 2、配置lib库目录 要将Python39.lib加入编译链接。Visua…

深入理解 SQL 中的数据集合和数据关联

引言 在数据库管理系统中,数据集合和数据关联是 SQL 查询中常见的概念。它们是构建复杂查询和分析数据的基石。本文将深入探讨 SQL 中的数据集合和数据关联,包括它们的概念、常见用途以及实际示例。 首先引入一下数学中的集合 集合的基本概念&#x…

一文教会女朋友学会日常Git使用!Git知识总结

文章目录 一文教会女朋友学会日常Git使用!Git知识总结一、git基本知识了解1.git简介2.git区域了解3.git常用命令 二、常用工作场景1.克隆远程仓库,把仓库代码拉到本地2.推送代码到远程仓库(1)本地代码和远程仓库版本相同&#xff…

【微服务】Sentinel(流量控制)

文章目录 1.基本介绍1.Sentinel是什么2.Sentinel主要特性3.Sentinel核心功能1.流量控制2.熔断降级3.消息削峰填谷 4.Sentinel两个组成部分 2.Sentinel控制台显示1.需求分析2.下载3.运行1.进入cmd2.输入java -jar sentinel-dashboard-1.8.0.jar3.查看默认端口8080 4.访问1.账号和…

数据结构(一)----前导知识

目录 一.数据相关 1.数据元素与数据项 2.数据对象和数据结构 3.数据结构的三要素 (1)逻辑结构 (2)数据运算 (3)物理结构(存储结构) 4.数据类型和抽象数据类型 二.算法 1.算…

[数据结构]排序

本篇主要是对常见排序的分类和一些排序的详解 一、插入排序 1.直接插入排序 // 直接插入排序函数 void insertionSort(int arr[], int n) {int i, key, j;for (i 1; i < n; i) {key arr[i]; // 取出待排序的元素j i - 1;// 将大于key的元素向后移动一位while (j > 0…

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器 1、接上篇 Windows Server 2022 使用ApacheDS用户认证 使用Administrator用户远程登录192.168.1.100windows server&#xff0c;打开pGina软件 2、输入刚刚在ApacheDS中的新添加的用户测试一下&#xff0c;会自动添加…

设计模式之抽象工厂模式精讲

概念&#xff1a;为创建一组相关或相互依赖的对象提供一个接口&#xff0c;而且无须指定他们的具体类。 抽象工厂模式是工厂方法模式的升级版本。在存在多个业务品种或分类时&#xff0c;抽象工厂模式是一种更好的解决方式。 抽象工厂模式的UML类图如下&#xff1a; 可以看…

C++教学——从入门到精通 4.setw()语句

这次玩点新鲜的------setw() 这家虎是啥呢&#xff1f; 我们编程输出的时候总是要输出空格&#xff0c;但有些时候又点的手都麻了 这时setw语句就派上用场了 具体怎么用呢&#xff1f; 如下图 #include"iostream"// #include"iomanip"// bits/stdc…

OSCP靶场--RubyDome

OSCP靶场–RubyDome 考点(CVE-2022-25765 suid ruby提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.249.22 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-29 00:28 EDT Nmap scan report for 192.168.249.22 Hos…

配置文件乱码

1、改UTF-8 &#xff08;1&#xff09;已经创建的项目 (2)新项目也改一下

YOLOv9改进策略 :主干优化 | 极简的神经网络VanillaBlock 实现涨点 |华为诺亚 VanillaNet

💡💡💡本文改进内容: VanillaNet,是一种设计优雅的神经网络架构, 通过避免高深度、shortcuts和自注意力等复杂操作,VanillaNet 简洁明了但功能强大。 💡💡💡引入VanillaBlock GFLOPs从原始的238.9降低至 165.0 ,保持轻量级的同时在多个数据集验证能够高效涨点…

北京WordPress建站公司

北京wordpress建站&#xff0c;就找北京wordpress建站公司 http://wordpress.zhanyes.com/beijing

java--this关键字

this代表当前对象&#xff0c;this后面可以加&#xff1a; 1、属性--> this.属性&#xff1a; 当方法中的局部变量与成员变量名称相同时&#xff0c;成员变量必须用this&#xff0c;其它情况的this可以省略 2、方法--this.方法&#xff1a;静态方法中不能使用this关键字&…

非关系型数据库之Redis配置与优化

一、关系数据库与非关系型数据库 1.1关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0c;用…

求组合数I(acwing)

题目描述&#xff1a; 给定n组询问&#xff0c;每组询问给定两个整数a&#xff0c;b&#xff0c;请你输出Ca^b mod(1e97)的值。 输入格式: 第一行包含整数n。 接下来n行&#xff0c;每行包含一组a和b。 输出格式: 共n行&#xff0c;每行输出一个询问的解。 …

什么是ISP住宅IP?相比于普通IP它的优势是什么?

什么是ISP住宅IP&#xff1f; ISP住宅IP是指由互联网服务提供商&#xff08;ISP&#xff09;分配给住宅用户的IP地址。它是用户在家庭网络环境中连接互联网的标识符&#xff0c;通常用于上网浏览、数据传输等活动。ISP住宅IP可以是动态分配的&#xff0c;即每次连接时都可能会…

java基础动态代理和反射(一)-- 动态代理,反射,动态语言,静态语言

动态代理 代理&#xff1a;本来应该自己做的事情&#xff0c;却请来了别人来做&#xff0c;被请的人就是代理对象。动态代理&#xff1a;在程序运行过程中产生的这个对象。动态代理其实就是通过反射来生成一个代理。 import java.lang.reflect.InvocationHandler; import jav…

苹果推出Swift开发教程 无需编码知识小白也能学

简介 苹果推出Swift开发教程&#xff0c;教授开发者如何使用 Swift、SwiftUI 和 Xcode 开发 iOS 应用。从基本的界面设计到复杂的数据建模和空间计算。据苹果公司称&#xff0c;网站上提供的教程 "适合所有人"&#xff0c;即使是那些没有任何编码经验的人。教程提供…

让工作自动化起来!无所不能的Python

让工作自动化起来&#xff01;无所不能的Python 让工作自动化起来&#xff01;无所不能的Python编辑推荐内容简介作者简介前言为什么要写这本书读者对象如何阅读本书 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全…