自动化测试框架对比

ops/2024/10/10 20:35:41/

一、自动化测试框架对比

二、对比与选型

TestNG基于Java语言,具有强大的测试报告和日志功能,并支持并发测试和数据驱动测试。适用大型项目和复杂场景,更方便地管理和组织测试用例。在需要进行大规模、高并发的测试场景下,可以选择TestNG作为测试框架。

Robot Framework是基于Python的通用测试框架,具有易于使用的语法和丰富的库,可以支持Web、API、移动和桌面应用程序的测试。它还具有强大的测试报告和日志功能,并支持数据驱动测试和关键字驱动测试。如果项目跨多个平台和应用测试,并且需要快速编写测试用例和生成详细的测试报告,那么选择Robot Framework框架。

Unnitest是Python自带的单元测试框架,具有轻量级和易于使用的特点,适用于小型项目和简单场景。可以编写和运行简单的测试用例,并生成基本的测试报告和日志。在需要进行简单的单元测试或集成测试场景下,可以使用Unnitest作为测试框架。

综上所述,从项目需求和技术栈两个方面考虑,TestNG或Robot Framework支持更多功能和多种测试类型,Unnittest相对来说仅支持简单单元测试或集成测试,从长远的测试体系建设来看,前者是更优的选择。

三、测试框架实例

1.Unnitest + DDT

使用 Unittest + DDT 编写的测试用例实例:

功能点:登录页面,包含用户名和密码的输入框以及一个登录按钮。我们需要编写一个测试用例,来测试不同的用户名和密码组合是否能够成功登录。

(1)安装DDT库,使用以下命令进行安装: ``` pip install ddt ```

(2)编写一个测试用例,使用@ddt装饰器来标记测试方法,并使用@data和@unpack装饰器来提供测试数据。

以下是一个示例代码: 

```pythonimport unittestfrom ddt import ddt, data, unpack@ddtclass LoginTest(unittest.TestCase):@data(("user1", "password1"), ("user2", "password2"), ("user3", "password3"))@unpackdef test_login(self, username, password):# 打开登录页面driver.get("https://example.com/login")# 输入用户名和密码driver.find_element_by_name("username").send_keys(username)driver.find_element_by_name("password").send_keys(password)# 点击登录按钮driver.find_element_by_name("submit").click()# 验证登录是否成功self.assertTrue(driver.find_element_by_css_selector("div.success-message").is_displayed())```

 在上面的代码中,我们使用了@data和@unpack装饰器来提供测试数据。每个元组代表一个测试数据,元组中的第一个元素是用户名,第二个元素是密码。在测试方法中,我们首先打开登录页面,然后输入用户名和密码,点击登录按钮,最后验证登录是否成功。

这个实例中,我们使用了DDT库来提供测试数据,可以轻松地测试多种情况下的登录行为。

2.Robot Framwork(Python)

当涉及到复杂场景时,Robot Framework可以很好地处理。使用Robot Framework编写测试用例的具体实例:

功能点:一个网站的注册功能,要求用户输入用户名、电子邮件、密码和确认密码。在这个场景中,我们需要测试以下几个方面:

1. 用户名、电子邮件、密码和确认密码都必须填写。

2. 用户名和电子邮件必须是唯一的。

3. 密码和确认密码必须匹配。

4. 用户名、电子邮件和密码必须符合一定的格式要求。

以下是一个示例代码:

```*** Settings ***Library  SeleniumLibrary*** Variables ***${BROWSER}  chrome${URL}  http://example.com/register*** Test Cases ***Valid Registration[Tags]  happy-pathOpen Browser  ${URL}  ${BROWSER}Input Text  username_field  testuserInput Text  email_field  testuser@example.comInput Text  password_field  testpasswordInput Text  confirm_password_field  testpasswordClick Button  register_buttonWait Until Page Contains  Welcome to the site, testuser!Invalid Registration - Missing Required Fields[Tags]  sad-pathOpen Browser  ${URL}  ${BROWSER}Input Text  email_field  testuser@example.comInput Text  password_field  testpasswordInput Text  confirm_password_field  testpasswordClick Button  register_buttonWait Until Page Contains  Please fill in all required fields.Invalid Registration - Duplicate Username[Tags]  sad-pathOpen Browser  ${URL}  ${BROWSER}Input Text  username_field  testuserInput Text  email_field  testuser2@example.comInput Text  password_field  testpasswordInput Text  confirm_password_field  testpasswordClick Button  register_buttonWait Until Page Contains  Username already exists.Invalid Registration - Duplicate Email[Tags]  sad-pathOpen Browser  ${URL}  ${BROWSER}Input Text  username_field  testuser2Input Text  email_field  testuser@example.comInput Text  password_field  testpasswordInput Text  confirm_password_field  testpasswordClick Button  register_buttonWait Until Page Contains  Email already exists.Invalid Registration - Passwords Do Not Match[Tags]  sad-pathOpen Browser  ${URL}  ${BROWSER}Input Text  username_field  testuser2Input Text  email_field  testuser2@example.comInput Text  password_field  testpasswordInput Text  confirm_password_field  testpassword2Click Button  register_buttonWait Until Page Contains  Passwords do not match.Invalid Registration - Invalid Username Format[Tags]  sad-pathOpen Browser  ${URL}  ${BROWSER}Input Text  username_field  testuser@Input Text  email_field  testuser3@example.comInput Text  password_field  testpasswordInput Text  confirm_password_field  testpasswordClick Button  register_buttonWait Until Page Contains  Username must contain only letters and numbers.Invalid Registration - Invalid Email Format[Tags]  sad-pathOpen Browser  ${URL}  ${BROWSER}Input Text  username_field  testuser3Input Text  email_field  testuser3example.comInput Text  password_field  testpasswordInput Text  confirm_password_field  testpasswordClick Button  register_buttonWait Until Page Contains  Email must be a valid email address.```

在这个例子中,我们使用SeleniumLibrary打开浏览器,输入测试数据并单击注册按钮。我们还使用“Wait Until Page Contains”关键字来等待页面加载完毕并检查页面上是否出现了特定的文本。使用“Tags”来标记每个测试用例,以便在运行测试时可以选择性地运行它们。

3.TestNG(Java)

测试点:一个电商网站的购物车功能,其中包括以下几个测试步骤:

1)用户登录网站

2)用户搜索商品并添加到购物车

3)用户查看购物车并验证商品信息

4) 用户删除购物车中的商品

下面是一个示例代码:

 ```javaimport org.testng.annotations.Test;import org.testng.Assert;public class ShoppingCartTest {@Test(priority = 1)public void testLogin() {// 执行用户登录操作// 验证登录成功Assert.assertTrue(isLoggedIn());}@Test(priority = 2)public void testAddToCart() {// 执行搜索商品并添加到购物车操作// 验证商品已成功添加到购物车Assert.assertTrue(isItemAddedToCart());}@Test(priority = 3)public void testViewCart() {// 执行查看购物车操作// 验证购物车中包含正确的商品信息Assert.assertTrue(isCartContainsCorrectItems());}@Test(priority = 4)public void testRemoveFromCart() {// 执行删除购物车中的商品操作// 验证购物车中不再包含已删除的商品Assert.assertTrue(isItemRemovedFromCart());}// 辅助方法private boolean isLoggedIn() {// 验证用户是否已登录return true;}private boolean isItemAddedToCart() {// 验证商品是否已成功添加到购物车return true;}private boolean isCartContainsCorrectItems() {// 验证购物车中是否包含正确的商品信息return true;}private boolean isItemRemovedFromCart() {// 验证购物车中是否不再包含已删除的商品return true;}}```

该用例使用TestNG的@Test注释来标记每个测试方法,并使用priority属性来指定测试方法的执行顺序。还使用Assert类验证每个测试步骤是否成功执行,确保购物车功能的各个方面都得到正确的测试和验证。

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】


http://www.ppmy.cn/ops/19251.html

相关文章

蛋糕购物商城

蛋糕购物商城 运行前附加数据库.mdf(或使用sql生成数据库) 登陆账号:admin 密码:123456 修改专辑价格时去掉¥以及上传专辑图片 c#_asp.net 蛋糕购物商城 网上商城 三层架构 在线购物网站,电子商务系统 …

R可视化:ggplot2绘制双y轴图

介绍 ggplot2绘制双y轴图加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(readxl)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2)Importing data 下载Underdetection of c…

R可视化:分组频率分布直方图和密度图

介绍 ggplot2绘制分组频率分布直方图和密度图 加载R包 knitr::opts_chunk$set(message FALSE, warning FALSE) library(tidyverse) library(patchwork) library(ggpubr) library(rstatix)# rm(list ls()) options(stringsAsFactors F) options(future.globals.maxSize …

11 c++版本的贪吃蛇

前言 呵呵 这大概是 大学里面的 c 贪吃蛇了吧 有一些 面向对象的理解, 但是不多 最近 因为想要 在单片机上面移植一下 贪吃蛇, 所以 重新拿出了一下 这份代码 然后 将它更新为 c 版本, 还是 用了一些时间 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用…

vue+vue-qr生成带logo的二维码并自动下载

1.安装 vue-qr组件: yarn vue-qr --save 或者 npm install vue-qr --save2.页面挂载使用:(也可以在main.js全局挂载) 单页面引入: import vueQr from vue-qr; export default {components: {vueQr}, }3.全局挂载引入: import …

URL路由基础与Django处理请求的过程分析

1. URL路由基础 对于高质量的Web应用来讲,使用简洁、优雅的URL设计模式非常有必要。Django框架允许设计人员自由地设计URL模式,而不用受到框架本身的约束。对于URL路由来讲,其主要实现了Web服务的入口。用户通过浏览器发送过来的任何请求&am…

某翻译平台翻译接口逆向之webpack学习

逆向网址 aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLw 逆向链接 aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tLyMv 逆向接口 aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRl 逆向过程 请求方式 POST 逆向参数 sign c168e4cb76169e90f82d28118dbd24d2 接口请求结果解密 过程分析 根据XHR…

Qt tcp通信(客户端+服务器一对一)

学习自《Qt5.9 C开发指南》 服务器端: QTcpServer *tcpServer; //TCP服务器 tcpServernew QTcpServer(this); connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection())); 当有新的客户端接入时,QTcpServer内部的incomingConnectio…