自动化 单元测试Test

XCTest测试框架(单元测试XCTests、性能测试XCPPerformanceTests、用户界面测试XCUItests)
单元测试XCTests:测试应用中事件或逻辑是否预期工作。
用户界面测试XCUItests:测试用户与应用的UI交互(如点击按钮、滑动屏幕)。
性能测试XCPPerformanceTests:量化测试代码的性能并在代码更改后跟踪变化。
测试断言:XCTest提供断言API供验证结果(XCTAssertTrue()/XCTAssertFalse()/XCTAssertEqual() )。
集成和运行:可直接从Xcode工具的测试导航器运行(XCTest集成在Xcode中)。
测试报告:Xcode为执行的XCTest测试生成详细的测试报告。

1.创建Native项目包时伴随创建测试(环境)或通过‘测试导航’菜单>
在这里插入图片描述
2.测试(环境)文件夹 xxTests/xxUITests
3.环境下测试文件的在这里插入代码片具体分析
在这里插入图片描述

//  自动化测试 环境
//  KeepThreadAliveTests.m
//  KeepThreadAliveTests
//
//  Created by haijunyan on 2023/12/9.
//

#import <XCTest/XCTest.h>

@interface KeepThreadAliveTests : XCTestCase

@end

@implementation KeepThreadAliveTests

- (void)setUp {
    //setUp当前测试类初始化事件(首先被调用)(资源准备)

}

- (void)tearDown {
    //tearDown销毁事件(资源的清理销毁/最后被调用)

}

- (void)testExample {
    //测试用例函数(功能测试用例)
    //XCTAssert断言/相关函数验证结果
}

- (void)testPerformanceExample {
    //性能测试函数(性能测试用例)
    //量化块measureBlock的IMP被默认执行10次并输出对应的耗时报告
    //IMP耗时报告
    [self measureBlock:^{

    }];
}

//测试函数:1.void 2.‘-’实例事件且无入参3.test开头
//自定义测试函数的执行顺序:与函数名中test后字符码大小有关(如 -(void)test001XXX先于-(void)test002XXX 执行)
//运行测试环境快捷键:CMD + U
//断言API(系统提供且可供调用)
//XCTFail(format…)生成一个失败的测试
//XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过
//XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;
//XCTAssert(expression, format...)当`expression`求值为 `TRUE`时通过
//XCTAssertTrue(expression, format...)当`expression` 求值为`TRUE`时通过
//XCTAssertFalse(expression, format...)当`expression` 求值为`False`时通过
//XCTAssertEqualObjects(a1, a2, format...)判断相等`[a1 isEqual:a2]`值为YES时通过,其中一个不为空时,不通过
//XCTAssertNotEqualObjects(a1, a2, format...)判断不等, `[a1 isEqual:a2]`值为 `False` 时通过
//XCTAssertEqual(a1, a2, format...)判断相等(`a1 == a2`是否返回一个`YES`)(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现 `NSString` 也可以)
//XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用)
//XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...) 判断相等(`double`或`float`类型)提供一个误差范围,当在误差范围(`+/-accuracy`)以内相等时通过测试
//XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等(`double`或`float`类型)提供一个误差范围,当在误差范围以内不等时通过测试
//XCTAssertThrows(expression, format...) 异常测试,当 `expression`发生异常时通过;反之不通过;
//XCTAssertThrowsSpecific(expression, specificException, format...)异常测试,当`expression`发生 `specificException` 异常时通过;反之发生其他异常或不发生异常均不通过
//XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...) 异常测试,当`expression` 发生具体异常、具体异常名称的异常时通过测试,反之不通过
//XCTAssertNoThrow(expression, format…)异常测试,当`expression`没有发生异常时通过测试
//XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当`expression`没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
//XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...) 异常测试,当`expression`没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
//代码覆盖率越高说明测试环境涉及的功能越全(测试质量保障)
//点击'editscheme',对应的tagart->test->codeCoverage

- (void)testAsync {
    XCTestExpectation *except = [self expectationWithDescription:@"异步请求测试用例"];
//    [self.viewModel requestData:^(BOOL success) {
//        XCTAssertTrue(success);
    //调用fulfill后,表示异步逻辑完成
//        [except fulfill];
//    }];
    [self waitForExpectationsWithTimeout:10 handler:^(NSError * _Nullable error) {

    }];
}

//测试(逻辑部分)几点建议:
//在编码时,要尽量按照MVVM的模式进行开发,相比MVC模式,MVVM的逻辑代码都封装在VM里面,更利于进行脱离UI的测试。可以设想,如果将逻辑方法都写在View或ViewController中,则执行测试用例时就不得不引入很多额外的页面UI组件。
//编写测试用例时,有3个核心点,即输入,输出和结果判定。通过输入来设置测试用例的初始状态,通过对输出的结果判定来决定测试用例是否通过
//编写的测试函数要尽量符合下面特性:功能单一,有输入有输出。
//函数有输入参数,没有返回值时,需要对输入的参数进行修改,则这种场景编写测试用例时,要判断的是执行函数操作后的原始变量是否符合预期。
//函数没有输入参数,没有返回值时,其作用只是执行一段逻辑操作,例如存储文件,修改文件等。这时我们可以修改下功能函数,在函数内返回操作成功或失败的结果,测试用例使用此结果来作为是否通过的标准。

@end

- (void)testLaunchPerformance {
    //测试 启动时长性能
    if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *)) {
        //衡量启动应用所耗时长
        [self measureWithMetrics:@[[[XCTApplicationLaunchMetric alloc] init]] block:^{
            //IMP默认多次启动执行(查看每次时长,对比结果)
            [[[XCUIApplication alloc] init] launch];
        }];
    }
}

备注:
单元测试

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电池电量监测系统设计 单片机+LabVIEW+Matlab+Protues+Keil程序

目录 前言 提供 软件 系统展示 1.放电试验及其处理 2.硬件系统原理图 3.下位机程序 4.显示 5.上位机界面 6.上位机程序 7.文档 资料下载地址&#xff1a;电池电量监测系统设计 单片机LabVIEWMatlabProtuesKeil程序 前言 这套系统首先使用Matlab分析获得了电压…

【opencv】示例-essential_mat_reconstr.cpp 从两幅图像中恢复3D场景的几何信息

导入OpenCV的calib3d, highgui, imgproc模块以及C的vector, iostream, fstream库。定义了getError2EpipLines函数&#xff0c;这个函数用来计算两组点相对于F矩阵&#xff08;基础矩阵&#xff09;的投影误差。定义了sgn函数&#xff0c;用于返回一个双精度浮点数的符号。定义了…

系统架构设计图

首先明确应用架构的定义&#xff0c;从百度百科上即可了解到何为应用架构&#xff1a; 应用架构&#xff08;Application Architecture&#xff09;是描述了IT系统功能和技术实现的内容。应用架构分为以下两个不同的层次&#xff1a; 企业级的应用架构&#xff1a;企业层面的应…

git bash用法-批量修改文件名

在win系统上安装git bash可以使用命令行模式操作&#xff0c;比较方便 1.原始文件名 2.代码 for file in *3utr*; do mv "$file" "$(echo "$file" | sed s/3utr/5utr/)"; done3.修改后的文件名

基于FPGA的HDMI设计导航页面

FPGA使用HDMI更多时候用于传输图像数据&#xff0c;并不会传输音频数据&#xff0c;因此以下文章均采用DVI接口协议&#xff0c;HDMI与DVI的视频传输协议基本一致&#xff0c;区别也很小。 首先需要了解HDMI的来源&#xff0c;以及物理接口类型以及引脚信号&#xff0c;最后对几…

自动化测试-web(弹窗/滚动条/鼠标/等待等操作)

一、弹窗 为什么要处理弹窗&#xff1f; 如果页面操作过程中&#xff0c;有弹窗出现&#xff0c;不处理&#xff0c;无法继续对页面操作。 弹窗类型&#xff1a; js原生弹窗&#xff1a; 警告框、输入框、提示框&#xff0c;这些必须处理 如何处理&#xff1a; 1&#xff0…

HarmonyOS实战开发-设备管理合集(非系统特性)

介绍 本示例集合设备管理相关&#xff08;非系统特性&#xff09;不需要复杂功能展示的模块&#xff0c;展示了各个模块的基础功能&#xff0c;包含&#xff1a; ohos.batteryInfo (电量信息)ohos.charger (充电类型)ohos.deviceInfo (设备信息)ohos.power (系统电源管理)oho…

Windows上面搭建Flutter Android运行环境

Flutter Android环境搭建 电脑上面安装配置JDK电脑上下载安装Android Studio电脑上面下载配置Flutter Sdk &#xff08;避坑点一&#xff09;下载SDK配置对应的环境变量 到path 电脑上配置Flutter国内镜像运行 flutter doctor命令检测环境是否配置成功创建运行Flutter项目&…

openssl3.2 - exp - zlib

文章目录 openssl3.2 - exp - zlib概述笔记命令行实现程序实现备注 - 压缩时无法base64压缩时无法带口令压缩实现 - 对buffer进行压缩和解压缩测试效果工程实现main.cppCOsslZlibBuffer.hCOsslZlibBuffer.cpp总结END openssl3.2 - exp - zlib 概述 客户端和服务端进行数据交换…

数据库的负载均衡,高可用实验

一 高可用负载均衡集群数据库实验 1.实验拓扑图 2.实验准备(同一LAN区段)&#xff08;ntp DNS&#xff09; 客户端&#xff1a;IP&#xff1a;192.168.1.5 下载&#xff1a;MariaDB 负载均衡器&#xff1a;IP&#xff1a;192.168.1.1 下载&#xff1a;keepalived ipvsadm I…

鸿蒙实战开发-如何实现选择并查看文档与媒体文件

介绍 应用使用ohos.file.picker、ohos.multimedia.mediaLibrary、ohos.file.fs 等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用展示出最近打开过的文档信息&#xf…

【JavaWeb】Servlet与过滤器

目录 ServletServlet做了什么JSP与Servlet的关系主要Servlet API介绍如何创建ServletServlet中主要方法ServletRequestServletResponseServletConfig Servlet生命周期Servlet创建Servlet部署与运行 ServletConfig类ServletConfig类的三大作用 ServletContext类ServletContext类…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之八 简单视频素描效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之八 简单视频素描效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之八 简单视频素描效果 一、简单介绍 二、简单指定视频某片段快放效果实现原理 三、简单指定视频某…

web安全学习笔记(9)

记一下第十三课的内容。 准备工作&#xff1a;在根目录下创建template目录&#xff0c;将login.html放入其中&#xff0c;在该目录下新建一个reg.html。在根目录下创建一个function.php 一、函数声明与传参 PHP中的函数定义和其他语言基本上是相同的。我们编辑function.php …

stm32f103c8t6学习笔记(学习B站up江科大自化协)-看门狗【WDG】

硬件部分 一、看门狗简介 看门狗-WDG&#xff08;watchdog&#xff09; 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态…

相机参数的意义

相机标定的意义&#xff1a; 相机标定&#xff1a;使用带有pattern的标定板来求解相机参数的过程&#xff1b;用一个简化的数学模型来代表复杂的三维到二维的成像过程&#xff1b;相机参数包括&#xff1a;相机内参&#xff08;焦距等&#xff09;&#xff0c;外参&#xff08…

为什么需要SOCKS代理?

在数字化时代&#x1f310;&#xff0c;随着网络安全威胁的不断演进和增加&#xff0c;保护个人隐私和数据安全成为了互联网用户的一大挑战&#x1f6e1;️。在寻求增强在线安全和隐私的解决方案时&#xff0c;SOCKS代理成为了一个关键的技术工具&#x1f511;。本文旨在详细探…

代码随想录:栈与队列4-6

20.有效的括号 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一…

什么是容器安全,该怎么进行容器安全的检测防护

随着容器技术的迅速发展和普及&#xff0c;越来越多的企业开始采用容器化解决方案来优化应用部署、提高资源利用率和降低成本。然而&#xff0c;在对大规模部署和使用容器应用来提升业务系统开发速度的时候&#xff0c;大量的数据对象、多种安全风险都需要检测&#xff0c;容器…

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人。shit!! 实测1&#xff1a;TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑&#xff0c;我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS time FROM table1 WHERE…