精通软件性能测试与LoadRunner最佳实战

出版社:于涌、王磊、曹向志、 高楼 人民邮电出版社 (2013-06出版)
出版日期:2013-6
ISBN:9787115315335
作者:于涌,王磊,曹向志
页数:745页

作者简介

《精通软件性能测试与LoadRunner最佳实战》分为15章,内容从测试项目实战需求出发,讲述了软件测试的分类以及测试的流程等,还重点讲述了性能测试技术和LoadRunner11.0工具应用的实战知识。为了有效地解决工作中遇到的问题,将实践中经常遇到的问题进行总结汇总成几十个解决方案。详细的项目案例、完整的性能测试方案、计划、用例设计、性能总结及相关交付文档为您做好实际项目测试提供了很好的帮助,基于LoadRunner和第三方工具对象的开发为您进行性能测试锦上添花,相信通过阅读《精通软件性能测试与LoadRunner最佳实战》一定会对您进行性能测试理论学习和实践大有裨益。

书籍目录

第1章 软件测试概述 1 1.1 软件测试基础 2 1.2 软件相关概念解析 3 1.3 软件测试的定义 4 1.4 软件测试的分类 5 1.4.1 黑盒测试、白盒测试与灰盒测试 5 1.4.2 静态测试与动态测试 7 1.4.3 单元测试、集成测试、系统测试与验收测试 9 1.4.4 其他测试 14 1.5 软件开发与软件测试的关系 16 1.5.1 常见的几种软件开发模式 16 1.5.2 测试与开发各阶段的关系 19 1.5.3 测试的经济学观念 20 1.6 软件测试流程 20 1.6.1 测试计划 21 1.6.2 测试设计 22 1.6.3 测试执行 31 1.6.4 测试总结 34 1.7 测试自动化的意义 41 第2章 性能测试过程概述 43 2.1 性能测试的基本过程 44 2.2 性能测试需求分析 45 2.3 性能测试计划 45 2.4 性能测试用例 46 2.5 测试脚本编写 48 2.6 测试场景设计 49 2.7 测试场景运行 50 2.8 场景运行监控 51 2.9 运行结果分析 51 2.10 系统性能调优 52 2.11 性能测试总结 53 第3章 性能测试与LoadRunner相关概念 55 3.1 性能测试的基本概念 56 3.1.1 典型的性能测试场景 56 3.1.2 性能测试的概念及其分类 56 3.1.3 性能测试工具的引入 57 3.2 LoadRunner及样例程序安装过程 57 3.2.1 Windows版本的安装过程 58 3.2.2 许可协议的应用 60 3.2.3 工具样例程序的安装过程 61 3.3 运行机制和主要组成部分 62 3.4 LoadRunner相关概念解析 63 3.4.1 集合点 63 3.4.2 事务 65 3.4.3 检查点 66 3.4.4 思考时间 68 第4章 应用LoadRunner进行性能测试示例 71 4.1 实例讲解脚本的录制、场景设计、结果分析过程 72 4.1.1 LoadRunner测试过程模型 72 4.1.2 实例讲解Web应用程序的应用 72 4.1.3 脚本处理部分 73 4.1.4 负载处理部分 84 4.1.5 系统性能改进意见 89 第5章 脚本语言编写基础 91 5.1 认识LoadRunner脚本语言 92 5.2 C语言基础 93 5.2.1 数据类型 93 5.2.2 C语言语句分类 99 5.2.3 基础知识 108 5.3 关联的应用 137 5.3.1 什么是关联 137 5.3.2 如何做关联 138 5.3.3 关联函数详解 143 5.3.4 实例讲解简单关联的应用 145 5.3.5 实例讲解较复杂关联的应用 147 5.4 动态链接库函数的调用 151 5.5 特殊函数应用注意事项 152 5.6 自定义函数应用 156 5.6.1 自定义函数仅应用于本脚本的实例 156 5.6.2 自定义函数的复用实例 158 5.7 IP欺骗的应用 159 第6章 深度解析LoadRunner11.0功能应用 163 6.1 VuGen应用介绍 164 6.2 协议的选择 164 6.2.1 Vuser类型 165 6.2.2 协议选择 167 6.3 脚本的创建过程 171 6.3.1 协议理解的误区 173 6.3.2 B/S架构应用程序脚本的实例应用 173 6.3.3 C/S架构应用程序脚本的实例应用 177 6.4 脚本的参数化 182 6.4.1 参数化的方法及其技巧 183 6.4.2 数据分配方法 184 6.4.3 数据更新方式 185 6.4.4 实例讲解数据分配和数据更新方式的应用 186 6.4.5 详解表数据参数类型 186 6.4.6 内部数据参数类型 188 6.5 调试技术 191 6.5.1 断点设置 191 6.5.2 单步跟踪 192 6.5.3 日志输出 192 6.6 Controller应用介绍 193 6.7 场景设置描述 194 6.7.1 面向目标的场景设计 195 6.7.2 基于手动的场景设计 198 6.8 负载生成器 214 6.9 IPWizard的应用 218 6.10 负载选项设置详解 221 6.11 性能指标监控 223 6.12 Analysis应用介绍 228 6.13 结果目录文件结构 229 6.14 AnalysisSummary分析 230 6.15 关于事务相关信息部分内容 231 6.15.1 关于分析概要事务相关信息问题提出 231 6.15.2 关于结果概要事务相关信息问题分析 231 6.15.3 关于结果概要事务脚本设计及其相关设置 232 6.15.4 如何解决结果概要信息不计入思考时间问题 234 6.15.5 如何知道每个虚拟用户负载时的取值 235 6.15.6 如何将数据导出到Excel文件中 239 6.15.7 如何对导出的数据进行筛选 240 6.15.8 如何对结果数据进行有效的分析 241 6.16 关于吞吐量相关信息部分内容 244 6.16.1 关于概要分析吞吐量等相关信息问题提出 244 6.16.2 关于概要分析吞吐量等相关信息问题分析 245 6.16.3 关于概要分析吞吐量等相关内容设计与实现 246 6.17 执行结果分析过程 248 6.17.1 合并图的应用 250 6.17.2 合并图的3种方式 250 6.17.3 自动关联的应用 251 6.17.4 交叉结果的应用 253 6.17.5 性能测试模型 254 6.17.6 性能瓶颈定位——拐点分析法 255 6.17.7 分析相关选项设置讲解 256 6.18 主要图表分析 258 6.18.1 虚拟用户相关图表 258 6.18.2 事务相关图表 259 6.18.3 错误相关图表 263 6.18.4 Web资源相关图表 265 6.18.5 网页诊断相关图表 272 6.18.6 系统资源相关图表 278 第7章 LoadRunner常见问题解答 283 7.1 如何突破参数的百条显示限制 284 7.2 如何突破Controller可用脚本50条限制 285 7.3 如何解决数据库查询结果过大导致录制失败 286 7.4 如何调整经常用到的相关协议脚本模板 286 7.5 如何将Connect()中的密文改为明文 288 7.6 如何添加并运用附加变量 289 7.7 如何解决脚本中的乱码问题 291 7.8 如何在录制时加入自定义标头 293 7.9 线程和进程运行方式有何不同 294 7.10 如何实现脚本分步录制 297 7.11 如何在脚本中应用常量和数组 297 7.12 VuGen中支持哪些步骤类型 299 7.13 如何处理ASP.NET中的ViewState 299 7.14 如何理解Return的返回值 304 7.15 如何解决负载均衡将压力作用到一台机器 305 7.16 如何对Apache服务器上的资源使用情况进行监控 307 7.17 如何在脚本中加入DOS命令 308 7.18 如何下载并保存文件到本地 308 7.19 如何理解常用图表的含义 311 7.20 基于目标和手动场景测试有何联系和不同 313 7.21 如何在命令行下启动Controller 316 7.22 如何解决由于设置引起的运行失败问题 316 7.23 如何实现对服务器系统资源的监控 317 7.24 如何实现对数据服务器的监控 322 7.25 如何实现对Web应用程序服务器资源监控 324 7.26 如何在Analysis图表中添加分析注释 326 7.27 如何确定登录达到响应时间为3秒的指标 329 7.28 如何使用自动关联对测试结果进行分析 331 7.29 如何根据分析结果判断性能有所改善 332 7.30 如何对图表进行合并,定位系统瓶颈 334 7.31 如何应用JavaVuser验证算法的执行效率 335 7.32 如何用程序控制网站的访问次数 339 7.33 几种不同超时的处理方法 343 7.34 如何才能将日期类型数据参数化到脚本中 344 7.35 如何自定义请求,并判断返回数据的正确性 348 7.36 LoadRunner如何运行WinRunner脚本 350 7.37 LoadRunner如何利用已有文本数据 353 7.38 如何能够产生样例程序的Session 355 7.39 如何能够实现PingIP的功能 357 7.40 如何在Vugen中自定义工具条按钮 358 7.41 如何在Vugen中Tools菜单中添加菜单项 360 7.42 如何在Vugen中给菜单项定义快捷键 361 7.43 为什么结果导出时会出现异常 362 7.44 如何增大网页细分图显示的URLS长度 362 7.45 如何设置登录的用户名和口令 363 7.46 如何在执行迭代时退出脚本 365 7.47 如何使用键盘快捷键 366 7.48 如何手动转换字符串编码 367 7.49 如何理解结果目录文件结构 368 7.50 如何监控Tomcat 369 7.51 如何在UNIX系统下用命令行运行脚本 374 7.52 如何使用C函数进行脚本跟踪 374 7.53 如何知道脚本对应路径下文件含义 375 7.54 如何结合企业特点进行性能测试 387 7.55 如何应用性能测试常用计算公式 389 7.56 如何掌握“拐点”分析方法 392 7.57 如何发现性能测试的规律 392 7.58 如何编写性能测试用例 393 7.59 如何对mysql数据库进行查询操作 396 7.60 为何无法与LoadGenerator通信 399 第8章 性能监控方法和性能监控工具应用 401 8.1 概述 402 8.2 进程相关指标和监控技术 402 8.2.1 Windows操作系统任务、进程介绍 402 8.2.2 Windows操作系统任务、进程监控技术 402 8.2.3 Windows操作系统任务、进程关闭技术 407 8.2.4 Linux操作系统任务、进程监控技术介绍 410 8.2.5 Linux操作系统进程监控技术 411 8.2.6 Linux操作系统进程终止技术 414 8.3 CPU相关指标和监控技术 416 8.3.1 CPU相关指标监控技术介绍 416 8.3.2 Windows操作系统中CPU相关指标监控技术 417 8.3.3 Linux操作系统中CPU相关指标监控技术 420 8.4 内存相关指标和监控技术 424 8.4.1 内存相关指标监控技术介绍 425 8.4.2 Windows操作系统中内存相关指标监控技术 425 8.4.3 Linux操作系统中内存相关指标监控技术 431 8.5 磁盘I/O相关指标和监控技术 434 8.5.1 磁盘I/O相关指标监控技术介绍 434 8.5.2 Windows操作系统磁盘I/O相关指标监控技术 436 8.5.3 Linux操作系统磁盘I/O相关指标监控技术 445 8.6 Nmon工具 448 8.6.1 Nmon工具介绍 448 8.6.2 Nmon工具使用讲解 448 8.7 Spotlight工具 458 8.7.1 Spotlight工具介绍 458 8.7.2 SpotlightonOracle 458 8.7.3 SpotlightonUnix 467 第9章 性能测试项目实施过程及文档写作 473 9.1 基于不同用户群的性能测试 474 9.2 验收测试通常提交的成果物 474 9.3 验收测试项目完整实施过程介绍 476 9.4 项目预算和项目立项 476 9.4.1 项目预算和项目立项 476 9.4.2 项目预算相关内容及样表展示 476 9.5 项目准备阶段及验收测试方案编写 477 9.5.1 项目人员入场 477 9.5.2 项目调研 478 9.5.3 验收测试方案 478 9.5.4 验收测试方案索引目录结构 478 9.5.5 验收测试方案的“引言”部分 481 9.5.6 验收测试方案的“系统介绍”部分 482 9.5.7 验收测试方案的“测试目标和标准”部分 483 9.5.8 验收测试方案的“测试需求分析”部分 483 9.5.9 验收测试方案的“测试策略”部分 484 9.5.10 验收测试方案的“项目实施阶段”部分 488 9.5.11 验收测试方案的“测试实施安排”部分 493 9.5.12 验收测试方案的“测试计划”部分 493 9.5.13 验收测试方案的“质量保证”部分 495 9.5.14 验收测试方案的“缺陷管理”部分 499 9.5.15 验收测试方案的“项目沟通”部分 501 9.5.16 验收测试方案的“工作产品”部分 501 9.6 验收测试实施过程及性能测试计划编写 502 9.6.1 性能测试计划 502 9.6.2 性能测试计划索引目录结构 503 9.6.3 性能测试计划的“简介”部分 504 9.6.4 性能测试计划的“测试业务及性能需求”部分 505 9.6.5 性能测试计划的“测试环境”部分 506 9.6.6 性能测试计划的“测试策略”部分 506 9.6.7 性能测试计划的“命名规范”部分 509 9.6.8 性能测试计划的“用例设计”部分 511 9.6.9 性能测试计划的“场景设计”部分 512 9.6.10 性能测试计划的“测试数据准备”部分 513 9.6.11 性能测试计划的“计划安排”部分 513 9.6.12 性能测试计划的“局限条件”部分 514 9.6.13 性能测试计划的“风险评估”部分 514 9.6.14 性能测试计划的“交付产品”部分 514 9.7 验收测试实施过程 515 9.7.1 性能测试脚本设计 515 9.7.2 性能测试脚本数据准备 521 9.7.3 性能测试场景设计 521 9.7.4 性能测试场景监控与场景执行 523 9.7.5 性能测试结果分析 528 9.7.6 性能调优 529 9.8 验收测试总结及其性能测试总结的编写 530 9.8.1 某单位某系统验收测试结论 530 9.8.2 某单位某系统验收测试交付清单 531 9.8.3 某单位某系统验收测试报告 531 9.8.4 某单位某系统验收测试性能测试报告 539 9.8.5 功能/性能测试缺陷遗留评审确认表格 547 9.8.6 项目管理相关表格 547 9.9 项目验收相关文档编写 549 9.9.1 验收申请 550 9.9.2 工作量确认 550 第10章 系统性能测试案例——GIS项目 551 10.1 GIS系统性能测试 552 10.1.1 项目性能测试需求的分析 552 10.1.2 确定性能测试考察指标 554 10.1.3 模型建立 556 10.1.4 集合点的说明 557 10.1.5 性能测试用例设计 558 10.1.6 工具的引入 560 10.1.7 脚本代码 560 10.1.8 场景设计 562 10.1.9 测试环境 562 10.1.10 场景执行 563 10.2 性能结果分析 564 第11章 性能测试案例——系统实现框架对比 573 11.1 第一部分 方案设计 574 11.1.1 项目性能测试需求分析 574 11.1.2 性能测试需求 574 11.1.3 系统架构 575 11.1.4 性能测试策略 575 11.1.5 测试资源 576 11.1.6 测试监控 578 11.1.7 里程碑计划 580 11.1.8 测试准则 580 11.1.9 测试风险 581 11.2 第二部分 测试执行 581 11.2.1 脚本编写 581 11.2.2 测试过程 584 11.3 第三部分 测试报告 586 11.3.1 性能对比结论摘要 586 11.3.2 问题分析 587 11.3.3 测试结果对比 588 11.3.4 性能对比结论 592 第12章 Web前端性能测试工具应用 595 12.1 前端性能测试 596 12.2 HttpWatch工具 596 12.2.1 HttpWatch简介 596 12.2.2 HttpWatch工具使用 597 12.3 DynaTraceAjax工具 605 12.3.1 DynaTraceAjax简介 605 12.3.2 DynaTraceAjax工具使用 605 12.4 FireBug工具 610 12.4.1 FireBug简介 610 12.4.2 Firebug工具使用 611 12.5 YSlow工具 613 12.5.1 YSlow简介 613 12.5.2 YSlow工具使用 613 12.6 前端性能改进 614 12.6.1 减少请求数量 614 12.6.2 应用缓存技术 617 12.6.3 CDN技术 620 12.6.4 减少DNS解析时间 621 12.6.5 压缩内容(GzipComponents) 621 12.6.6 其他方法 622 第13章 不同协议脚本应用实例讲解 625 13.1 一种特殊的数据库性能测试方法 626 13.1.1 数据库集群项目背景介绍 626 13.1.2 批处理方式解决方案 627 13.2 手工编写FTP脚本 629 13.2.1 手工编写脚本的策略 629 13.2.2 实例讲解手工编写FTP脚本 629 13.2.3 脚本编写注意事项 631 13.3 Foxmail邮件的发送脚本 632 13.4 详解.NET2008插件在开发环境中的应用 635 13.5 WindowsSockets协议脚本应用 639 13.6 TerminalEmulation(RTE)协议脚本应用 646 13.7 Citrix协议脚本应用 652 13.7.1 Citrix简单介绍 652 13.7.2 Citrix相关配置说明 653 13.8 EdgeSight 656 13.8.1 EdgeSight简单介绍 657 13.8.2 EdgeSight基本使用 657 13.9 数据库相关协议应用 662 13.9.1 工具支持哪些数据库相关协议 662 13.9.2 数据库函数说明 663 13.9.3 数据库脚本关联 666 13.10 AJAXTruClient协议应用 667 13.10.1 AJAX简介 667 13.10.2 AJAXTruClient脚本 668 13.10.3 AJAX(ClickandScript)脚本 672 13.11 Flex协议脚本应用 675 13.11.1 Flex简介 675 13.11.2 Flex脚本 676 13.11.3 Flex脚本关联 677 13.12 Real协议脚本应用 678 13.12.1 Real简介 678 13.12.2 Real脚本 679 13.13 WebServices协议脚本应用 681 13.13.1 WebServices简介 681 13.13.2 DelphiWebServices样例程序 684 13.13.3 WebServices脚本 692 第14章 利用高级语言开发性能测试辅助工具 697 14.1 LoadRunner场景运行控制器介绍 698 14.2 LoadRunner场景运行控制器源代码 700 14.2.1 场景运行控制器首界面源代码 701 14.2.2 场景运行控制器源代码 702 14.2.3 系统设置源代码 709 14.2.4 作品相关源代码 710 14.3 前端性能测试自动化介绍 715 14.4 HttpWatch前端性能测试自动化脚本 716 14.5 高级语言调用HttpWatch完成前端性能测试 721 第15章 性能测试应用策略及性能指标计算 725 15.1 性能测试在企业中的应用——量体裁衣 726 15.1.1 性能测试介绍 726 15.1.2 性能测试在软件企业的应用 727 15.1.3 总结 729 15.2 开发环境下的性能测试 730 15.2.1 负库存现象 730 15.2.2 插件的应用 730 15.2.3 总结 734 15.3 性能测试场景的选择及其用例设计、执行策略 735 15.3.1 性能测试用例的设计方法 735 15.3.2 实例讲解性能测试用例的设计 737 15.3.3 性能测试执行 740 15.3.4 性能测试的分析 741 15.3.5 系统的调优 741 15.4 性能测试常用计算公式汇总 742 15.4.1 吞吐量计算公式 742 15.4.2 并发数量计算公式 743 15.4.3 思考时间计算公式 744 参考文献 746

编辑推荐

基于LoadRunner 11进行了详细讲解及脚本案例开发3大完整性能测试案例及过程文档LoadRunner脚本编写技巧及注意事项、LoadRunner相关性能指标的由来、几十种性能问题和操作问题疑难解答Windows/Linux两大平台中4种性能指标的监控及多款著名监控工具使用HTTP、Socket、JVuser、RTE、.NET、FTP、SMTP等10余种测试协议及第三方工具应用详解前端性能改进方法与4种前端性能测试工具使用300多分钟的讲座视频、源代码和完整项目案例文档

内容概要

于涌,具有13年软件开发和软件测试方面工作工作经验。先后担任程序员、高级程序员、测试分析师、高级测试经理、测试总监等职位。拥有多年的软件开发、软件测试项目实践和教学经验。尤其擅长自动化测试、工具应用、单元测试等方面的工作。曾为多个软件公司提供软件测试知识、软件性能测试、性能测试工具LoadRunner、功能测试工具QTP、WinRunner、Jmeter等内容的培训工作。曾在程序员杂志上发表过多篇文章。

媒体关注与评论

很久就闻于涌老师的大名了,也在网上聊过很多次了,如今才买他老人家书,真实惭愧。书拿到的时候我非常非常的兴奋,迫不及待打开书,翻看了下目录。这本书真是性能测试的精髓,非常适合从事性能测试工作人员学习的一本好书。对我这个初学者来说,只有慢慢领悟和品味了。这本书凝聚着于涌老师多来年的呕心沥血,点点滴滴,我非常非常喜欢。亚马逊网友

章节摘录

版权页:   插图:   1.6.2测试设计 测试设计阶段要设计测试用例和测试数据,要保证测试用例完全覆盖测试需求。简单地说,测试用例就是设计一个情况,软件程序在这种情况下,必须能够正常运行并且达到程序所设计的执行结果。如果程序在这种情况下不能正常运行,而且这种问题会重现出来,那就表示已经测出软件有缺陷,这时候就必须将这个问题标示出来,并且输入到问题跟踪系统内,通知软件开发人员。软件开发人员接到通知后,将问题修改完成后,在下一个测试版本提交后,测试工程师取得新的测试版本,用同一个测试用例来测试这个问题,确保该问题被修复。在测试时,不可能进行穷举测试,为了节省时间和资源,提高测试效率,必须要从庞大的测试用例中精心挑选出具有代表性的测试数据来进行测试。使用测试用例的好处主要体现在以下几个方面。 (1)在开始实施测试之前设计好测试用例,可以避免盲目测试并提高测试效率。 (2)测试用例使软件测试的实施重点更加突出、目的更加明确。 (3)在软件版本更新后,只需修正少量的测试用例便可开展测试工作,降低工作强度,缩短项目周期。 (4)功能模块的通用化和复用化使软件易于开发,而测试用例的通用化和复用化则会使软件测试易于开展,并随着测试用例的不断精化,其效率也不断提高。 测试用例主要有如下几种。 (1)功能测试用例。包含功能测试、健壮性测试、可靠性测试。 (2)安全测试用例。 (3)用户界面测试用例。 (4)安装/反安装测试用例。 (5)集成测试用例。包含接口测试。 (6)性能测试用例。包含性能测试、负载测试、压力测试、容量测试、并发测试、配置测试、可靠性测试、失败测试。 1.6.2.1测试用例设计 测试设计阶段最重要的是如何将测试需求分解,如何设计测试用例。 1.如何对测试需求进行分解 对测试需求进行分解需要反复检查并理解各种信息,主要是和需求分析人员进行交流,必要的情况下也可以和用户交流,理解用户的真正需求是什么。 可以按照以下步骤执行。 (1)确定软件提供的主要功能、性能测试项详细内容。 (2)对每个功能,确定完成该功能所要进行的操作内容。 (3)确定数据的输入和预期的输出结果。 (4)确定会产生性能和压力测试的重要指标,包括硬件资源的利用率,业务的响应时间,并发用户数等重要内容。 (5)确定应用需要处理的数据量,根据业务情况预期未来2、3年内的数据扩展。 (6)确定需要的软件和硬件配置。 2.如何设计测试用例 测试用例一般指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略,需要指出的是,测试数据都是从庞大的可用测试数据中精心挑选出具有代表性的用例。测试用例是软件测试系统化、工程化的产物,而测试用例的设计一直是软件测试工作的重点和难点。


 精通软件性能测试与LoadRunner最佳实战下载



发布书评

 
 


精彩短评 (总计8条)

  •     纸张和质量都很满意,也附有光盘,会再光顾。
  •     理论部分感觉还可以,但书的光盘没有期待的那样好。都是讲的理论性的东西,没有讲实际的操作。
  •     名称叫最佳实践,然而一个完整的案例都没有,80%都介绍LoadRunner的使用.好书的话最后至少应该有,使用loadrunner针对3~4个不同类型的案例,如何做性能测试...
  •     包装比较残旧,感觉像放了很久的,四个角的都有比较明显折痕,但里面页面还是比较新,内容不错,买的时候知道是仓底货,所以心里还是比较平衡,也很幸运能买到。
  •     书还没开始仔细看。有一张光盘。
  •     刚拿到书,很厚的一本,是新出版的,还没有看。慢慢看吧!
  •     第一次收的货物,里面的光盘坏了,跟客服说后,当天立马又给我送了一套新的,感觉客服和售后都很敬业,赞一下。送快递的师傅和客服人员,都辛苦了!
  •     看了一下,感觉还蛮不错的
 

农业基础科学,时尚,美术/书法,绘画,软件工程/开发项目管理,研究生/本专科,爱情/情感,动漫学堂PDF下载,。 PDF下载网 

PDF下载网 @ 2024