文章目录
前言
随着金融科技的迅猛发展,金融贷款管理平台已成为金融机构不可或缺的重要工具。本报告针对某中小型金融贷款管理平台进行了软件测试,旨在评估该平台在功能、性能、安全性等方面的表现,确保其能够满足业务需求并稳定运行。本次测试基于严谨的测试方法和流程,通过详细的测试用例和数据分析,对平台进行评估和验证。
一、项目背景
- 当今经济快速发展的时代,金融行业作为经济发展的重要支柱,对于促进资金融通、优化资源配置、推动产业升级等方面发挥着至关重要的作用。然而,随着金融市场的不断扩大和深化,金融服务的对象也日益多样化,尤其是中小型企业和个人对于金融贷款的需求日益增长。传统的金融贷款方式存在诸多不足,如审批流程繁琐、效率低下、信息不对称等,这些问题极大地限制了中小型企业获取资金的渠道和速度。
- 为了解决这一难题,本项目致力于研发一个高效、便捷、安全、合法的中小型企业金融贷款管理平台。该平台旨在通过引入先进的信息化技术手段,管理产品信息、银行信息、用户信息,降低管理成本,提高服务效率,同时保障数据安全和隐私保护,为中小型企业提供更加优质的金融服务。
二、项目介绍
该项目是一个基于Spring Cloud和Vue.js的中小型金融贷款管理平台,采用微服务架构,实现了前后端的高度解耦,提升了系统的灵活性和性能。
项目功能:登录与注册、对产品表、银行表、用户表进行增删改查操作、关联数据处理和图片上传、登录密码修改与安全性、数据导入导出与图表分析、退出登录等。
三、测试计划
1)功能测试
测试用例
因功能相似,此处只选择较为复杂的产品表进行相应CRUD功能测试
执行测试
①登录界面
正常登录:输入正确的账号、密码、验证码,三者缺一不可,点击登录按钮。
预期结果: 登录成功后会跳转到主页面。页面
实际结果:
异常登录: 输入错误的账号或密码,点击登录按钮,结果是出现提示:账号或密码错误。
输入错误的验证码,点击登录按钮,结果是出现提示:验证码错误。
②产品信息测试
产品查询
正常查询:输入建设(产品名称可以模糊查询),利率查询为5的数据,点击快捷查询按钮。
预期结果:输出是数据库中查找到的数据。
实际结果:
异常查询:产品名称和利率都不输入,点击快捷查询按钮。
预期结果:无数据返回,页面仍是全部数据信息。
实际结果:
产品增加
正常增加:所有字段均填写,点击保存信息按钮。
预期结果:出现提示:增加产品成功,第三页可以查看刚刚增加的产品信息。
实际结果:
异常增加:不填写银行字段,点击保存信息按钮。结果是点击保存信息按钮无效(因为数据库中定义了该字段不为空)。
产品修改
正常修改:将序号1的产品最长期限由300修改为100,点击保存信息按钮。
预期结果:出现提示:修改产品成功,可以看到表中数据改变了。
实际结果:
产品删除
正常删除:选择想删除的产品,点击删除按钮,会出现是否确认删除的弹框,点击确定。
预期结果:出现提示:删除产品成功,表格中也找不到该条信息了。
实际结果:
产品利率对比图展示
导出数据
③产品分类信息测试
产品分类查询
正常查询:输入按揭(产品类型名称可以模糊查询),点击快捷查询按钮。
预期结果:输出是数据库中查找到的数据。
实际结果:
异常查询:产品类型名称不输入,点击快捷查询按钮。
预期结果:无数据返回,页面仍是全部数据信息。
实际结果:
产品类型增加
正常增加:所有字段均填写,点击保存信息按钮。
预期结果:出现提示:增加产品类型成功,第二页可以查看刚刚增加的产品类型信息。
实际结果:
异常增加:不填写产品类型名称,点击保存信息按钮。结果是点击保存信息按钮无效(因为数据库中定义了该字段不为空)。
产品类型修改
正常修改:将刚刚新增的创业贷款名称改为创业贷款new,点击保存信息按钮。
预期结果:出现提示:修改产品类型成功,可以看到表中数据改变了。
实际结果:
产品删除
正常删除:选择想删除的产品类型,点击删除按钮,会出现是否确认删除的弹框,点击确定。
预期结果:出现提示:删除产品类型成功,表格中也找不到该条信息了。
实际结果:
>
④用户信息测试
用户信息查询
正常查询:输入钱(用户名称可以模糊查询),选择内部人员,结束时间选择2024-07-01 12:00:00,点击快捷查询按钮。
预期结果:输出是数据库中查找到的数据。
实际结果:
异常查询:输入错误的登录用户,点击快捷查询按钮。
预期结果:数据库未查找到,无数据返回。
实际结果:
用户信息增加
正常增加:所有字段均填写,点击保存信息按钮。
预期结果:出现提示:增加用户成功,第二页可以查看刚刚增加的用户信息。
实际结果:
异常增加:不填写邮箱信息,点击保存信息按钮。结果是点击保存信息按钮无效(因为数据库中定义了该字段不为空)。
用户信息修改
正常修改:修改刘八的头像,点击保存信息按钮。
预期结果:出现提示:修改用户成功,可以看到表中头像改变了。
实际结果:
用户删除
正常删除:选择想删除的产品类型,点击删除按钮,会出现是否确认删除的弹框,点击确定。
预期结果:出现提示:删除用户成功,表格中也找不到该条用户信息了。
实际结果:
修改密码
点击头像旁边的修改密码,修改成功后会有提示:修改密码成功,然后强制跳转回登录页面重新登录。
2)自动化测试
注:因为项目是动态元素的场景下实现,仅仅靠复制cssSelector或者xpath是不可行的,需要copy full xpath实现。
登陆界面
// 登录页面测试用例
@ParameterizedTest
@CsvSource({"http://localhost:80/,zhangsan,password1,http://localhost/layout"})
void Login(String url, String username, String password,String expected_jump_url) throws InterruptedException {
webDriver.get(url);
// 输入用户名
webDriver.findElement(By.xpath("/html/body/div/div/div/div[2]/div/form/div[1]/div[2]/div/div/input")).sendKeys(username);
sleep(3000);
// 输入密码
webDriver.findElement(By.xpath("/html/body/div/div/div/div[2]/div/form/div[2]/div[2]/div/div/input")).sendKeys(password);
sleep(3000);
// 点击登录按钮
webDriver.findElement(By.xpath
("/html/body/div/div/div/div[2]/div/form/div[5]/div[2]/button/span")).click();
sleep(3000); // 等待页面加载
String cur_url=webDriver.getCurrentUrl();
if(cur_url.equals(expected_jump_url)){
System.out.println("测试通过");
}else{
System.out.println("测试不通过");
}
}
查询信息
//查询产品信息
@ParameterizedTest
@CsvSource({"工商银行住房贷款,3.9"})
void Select(String productName,String interestRate){
webDriver.get("http://localhost/layout/loanProduct");
// 等待输入框变得可交互
WebDriverWait wait=new WebDriverWait(webDriver,10);//最多等待10s
//点击模糊查询输入框
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath("/html/body/div[1]/div/section/section/main/form/div[1]/div/div/div/input"))).sendKeys(productName);
//点击精准查询输入框
wait.until(ExpectedConditions.visibilityOfElementLocated(
By.xpath("/html/body/div[1]/div/section/section/main/form/div[2]/div/div/div/input"))).sendKeys(interestRate);
webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/main/form/div[3]/div/button/span")).click();
//是否出来了查询结果即产品名称工商银行住房贷款是否出现
webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/main/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr/td[2]"));
}
增加信息
//增加产品信息
@ParameterizedTest
@CsvSource({"招商银行创业贷款,4.2,200000, 60,无需抵押,低利率,前三年优惠"})
void Add(String productName,String interestRate,String maxLimit,Integer maxTerm,String otherAttributes){
webDriver.get("http://localhost/layout/loanProduct");
//点击增加按钮
webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/main/button[1]/span")).click();
// 等待输入框变得可交互,增加产品信息
WebDriverWait wait = new WebDriverWait(webDriver, 10); // 最多等待10秒
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[1]/div[2]/div/div/input"))).sendKeys(productName);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[2]/div[2]/div/div/div[1]/div[2]"))).click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[2]/div[3]/div/div/div[1]/ul/li[4]"))).click(); //选择商业贷款
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[3]/div[2]/div/div/div[1]/div[2]"))).click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[2]/div[4]/div/div/div[1]/ul/li[8]"))).click(); //选择浦发银行
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[4]/div[2]/div/div/input"))).sendKeys(interestRate);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[5]/div[2]/div/div/input"))).sendKeys(maxLimit);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[6]/div[2]/div/div/input"))).sendKeys(String.valueOf(maxTerm));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[7]/div[2]/div/textarea"))).sendKeys(otherAttributes);
// 点击保存按钮(同样,使用更稳定的选择器)
WebElement saveButton = webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/footer/div/button/span"));
saveButton.click();
}
修改信息
//修改产品信息
@ParameterizedTest
@CsvSource({"3.5"}) // 将利率值修改为3.5
void modifyInterestRate(String interestRate) throws InterruptedException {
webDriver.get("http://localhost/layout/loanProduct");
// 点击修改按钮(这里应该使用更稳定的选择器)
WebElement modifyButton = webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/main/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[9]/div/button[1]/span")); // 替换为稳定的选择器
modifyButton.click();
// 等待利率输入框变得可交互
WebDriverWait wait = new WebDriverWait(webDriver, 10); // 最多等待10秒
WebElement interestInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/div/form/div[4]/div[2]/div/div/input")));
// 修改利率
interestInput.clear(); // 如果输入框中有默认值,先清除
interestInput.sendKeys(interestRate);
// 点击保存按钮(同样,使用更稳定的选择器)
WebElement saveButton = webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/main/div[3]/div/div/footer/div/button/span"));
saveButton.click();
}
删除信息
//删除信息
@Test
void DeleteCtbuLoan() throws InterruptedException {
//打开主页面
webDriver.get("http://localhost/layout");
sleep(3000);
//点击贷款产品管理
webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/aside/ul/li[2]/div/span")).click();
sleep(3000);
//点击产品信息
webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/aside/ul/li[2]/ul/li[1]")).click();
sleep(3000);
//点击删除按钮
webDriver.findElement(By.xpath("/html/body/div[1]/div/section/section/main/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[9]/div/button[2]/span")).click();
}
退出登录
//退出登录
@Test
void LogOut() throws InterruptedException{
//打开主页面
webDriver.get("http://localhost/layout");
//点击欢迎
webDriver.findElement(By.cssSelector("#app > div > section > header > div.welcome > div")).click();
sleep(2000);
//点击退出登录按钮
webDriver.findElement(By.cssSelector("body > div>div>div>div>div>ul> li:nth-child(3)")).click();
sleep(2000);
//检查是否存在用户名输入框以此来校验是否跳转到了登录页面
webDriver.findElement(By.cssSelector("body > div>div>div>div>div>form>div:nth-child(1)>div:nth-child(2)>div>div>input"));
}
总结
本次测试覆盖了登录页面、主界面、产品信息页面、产品类型信息页面、用户信息页面,测试的用例全部通过,自动化测试的部分并不复杂,但是最初未关注到我的项目元素前端在生成的时候是动态生成的,定位元素的时候仅仅靠复制cssSelector或者xpath是不可行的,解决办法是:一级一级去定位元素位置;复制copy full xpath。最终解决了问题。
最后,码字不易,如果觉得对你有帮助的话请点个赞吧,关注我,一起学习,一起进步!