iOS 单元测试之XCTest详解

iOS单元测试 XCTest XCTest 框架简介Overview(概述)TopicsTest Cases and Test MethodsXCTestCaseXCTestCustomizing Test Setup and TeardownsetUptearDownHandling Test Case FailureMeasuring PerformancemeasureBlock:defaultPerformanceMetricsXCTPerformanceMetricCreating Asynchronous Test Expe 阅读详情

原博文:http://blog.youkuaiyun.com/hello_hwc/article/details/46671053

前言:测试是一个好的App不可缺少的部分。每一个App都是由一个个小的功能组合到一起的。而这些小的功能又是由一个个函数或者说算法组合到一起的。单元测试就是对这些小的功能或者函数进行测试,良好的单元测试会让代码的健壮性提高很多。XCTest就是XCode为我们提供的一个框架,它提供了各个层次的测试。


XCTestCase

每个XCode创建iOS的工程中都有一个叫做”工程名Tests”的分组,这个分组里就是XCTestCase的子类,XCTest中的测试类都是继承自XCTestCase。 
例如新建一个工程,命名为Demo,就能看到如图 
 
看一下这个自动创建的文件里都包含了哪些内容

#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>

@interface DemoTests : XCTestCase

@end

@implementation DemoTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // This is an example of a functional test case.
    XCTAssert(YES, @"Pass");
}

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}

@end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

测试用例的命名

XCTest中所有的测试用例的命名都是以test开头的。例如上文中的

- (void)testExample {
    // This is an example of a functional test case.
    XCTAssert(YES, @"Pass");
}
  • 1
  • 2
  • 3
  • 4
  • 5

setUp和tearDown

Setup是在所有测试用例运行之前运行的函数,在这个测试用例里进行一些通用的初始化工作

tearDown是在所有的测试用例都执行完毕后执行的


XCode的测试用例导航

测试用例的导航如图,在测试用例的导航里,我们可以运行一组测试用例,也可以运行一个单独的测试用例 

可以鼠标右键来新建一组测试用例。 

也可以为测试用例添加失败断点来方便我们调试 


查看测试结果

通过测试导航栏可以查看到测试结果

通过Report导航栏可以看到更详细的测试结果

这里写图片描述

点击测试用例后面的箭头,可以跳转到测试用例的代码。


普通方法测试

例如,新建一个类命名为Model,他有这个方法用来生成10以内的随机数。

-(NSInteger)randomLessThanTen{
    return arc4random()%10;
}
  • 1
  • 2
  • 3

于是,测试方法为

-(void)testModelFunc_randomLessThanTen{
    Model * model = [[Model alloc] init];
    NSInteger num = [model randomLessThanTen];
    XCTAssert(num<10,@"num should less than 10");
}
  • 1
  • 2
  • 3
  • 4
  • 5

我们点击如图的左边图标单独运行这个测试用例,当然也可以在上文我提到的导航栏里单独运行。 
这里写图片描述 
然后会看到输出表示这个测试用例通过

Test Suite 'Selected tests' started at 2015-06-28 05:24:56 +0000
Test Suite 'DemoTests.xctest' started at 2015-06-28 05:24:56 +0000
Test Suite 'DemoTests' started at 2015-06-28 05:24:56 +0000
Test Case '-[DemoTests testModelFunc_randomLessThanTen]' started.
Test Case '-[DemoTests testModelFunc_randomLessThanTen]' passed (0.000 seconds).
Test Suite 'DemoTests' passed at 2015-06-28 05:24:56 +0000.
     Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.001) seconds
Test Suite 'DemoTests.xctest' passed at 2015-06-28 05:24:56 +0000.
     Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.001) seconds
Test Suite 'Selected tests' passed at 2015-06-28 05:24:56 +0000.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

常用断言

如何判断一个测试用例成功或者失败呢?XCTest使用断言来实现。 
最基本的断言 
表示如果expression满足,则测试通过,否则对应format的错误。

XCTAssert(expression, format...)
  • 1

还有一个用来直接Fail的断言

XCTFail(format...)
  • 1

其他一些常用的断言:

XCTAssertTrue(expression, format...)
XCTAssertFalse(expression, format...)
XCTAssertEqual(expression1, expression2, format...)
XCTAssertNotEqual(expression1, expression2, format...)
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNil(expression, format...)
XCTAssertNotNil(expression, format...)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

性能测试

所谓性能测试,主要就是评估一段代码的运行时间,XCTest的性能的测试利用如下格式

对于性能测试,每一个测试用例每次会运行10次。

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

例如,我要评估一段代码,循环打印NSLog 10000次。 
这段代码如下,这段代码我放在UIImage的类别里。

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        for (NSInteger index = 0; index < 10000; index ++) {
            NSLog(@"%ld",index);
        }
        // Put the code you want to measure the time of here.
    }];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我们都知道,测试要么成功,要么失败,那么就引入了一个关键的问题

  • 性能测试的时候,如何判一个性能测试case是成功还是失败呢?

我们先通过上文的方式,只运行一次这个测试用例。然后看看结果和输出(这个测试用例跑的很慢,别着急)

Test Case '-[ModelTests testPerformanceExample]' failed (37.432 seconds).
Test Suite 'ModelTests' failed at 2017-02-19 09:57:26.210.
     Executed 1 test, with 1 failure (0 unexpected) in 37.432 (37.433) seconds
Test Suite 'ToDoTests.xctest' failed at 2017-02-19 09:57:26.211.
     Executed 1 test, with 1 failure (0 unexpected) in 37.432 (37.434) seconds
Test Suite 'Selected tests' failed at 2017-02-19 09:57:26.211.
     Executed 1 test, with 1 failure (0 unexpected) in 37.432 (37.437) seconds

Test session log:
    /Users/hl/Library/Developer/Xcode/DerivedData/ToDo-bbcdkwvzbmyznocgystdcavfakca/Logs/Test/98E0FA82-BACC-4361-AF39-E0734F73A545/Session-ToDoTests-2017-02-19_095641-jm2eKF.log
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后,你会发现测试失败了!这是因为我们没有给性能测试一个参考时间。 
我们点击图中的的第二个叉箭头

这里写图片描述

然后,看到如图 

我们来看看这几个参数都是啥意思:

  • Baseline 计算标准差的参考值
  • MAX STDD 最大允许的标准差
  • 底部点击1,2…10可以看到每次运行的结果。

点击Edit,我们点击Average的右边的Accept,来让本次运行的平均值设置为baseline,然后然后MAX STDD改为40%。再运行这个测试用例,你会发现测试成功了。


异步测试

异步测试的逻辑如下,首先定义一个或者多个XCTestExpectation,表示异步测试想要的结果。然后设置timeout,表示异步测试最多可以执行的时间。最后,在异步的代码完成的最后,调用fullfill来通知异步测试满足条件。

- (void)testAsyncFunction{
    XCTestExpectation * expectation = [self expectationWithDescription:@"Just a demo expectation,should pass"];
    //Async function when finished call [expectation fullfill]
    [self waitForExpectationsWithTimeout:10 handler:^(NSError *error) {
        //Do something when time out
    }];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

举例

- (void)testAsyncFunction{
    XCTestExpectation * expectation = [self expectationWithDescription:@"Just a demo expectation,should pass"];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        NSLog(@"Async test");
        XCTAssert(YES,"should pass");
        [expectation fulfill];
    });
    [self waitForExpectationsWithTimeout:10 handler:^(NSError *error) {
        //Do something when time out
    }];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试结果

Test Suite 'Selected tests' started at 2015-06-28 05:49:43 +0000
Test Suite 'DemoTests.xctest' started at 2015-06-28 05:49:43 +0000
Test Suite 'DemoTests' started at 2015-06-28 05:49:43 +0000
Test Case '-[DemoTests testAsyncFunction]' started.
2015-06-28 13:49:44.920 Demo[2157:145428] Async test
Test Case '-[DemoTests testAsyncFunction]' passed (1.006 seconds).
Test Suite 'DemoTests' passed at 2015-06-28 05:49:44 +0000.
     Executed 1 test, with 0 failures (0 unexpected) in 1.006 (1.007) seconds
Test Suite 'DemoTests.xctest' passed at 2015-06-28 05:49:44 +0000.
     Executed 1 test, with 0 failures (0 unexpected) in 1.006 (1.009) seconds
Test Suite 'Selected tests' passed at 2015-06-28 05:49:44 +0000.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

代码覆盖率

选择Target,然后选择Test模块,然后勾选Gather coverage data

然后,在report模块中,就能看到每一个.m文件的代码覆盖情况了。


后续:

更新:2017.02.19 增加代码覆盖率,对性能测试进行详细的讲解。

计划下一篇会讲解Mock 测试以及一些常用的Mock小工具。



iOS 自动化单元测试--XCTest 一、前言: UITest的单元测试能最大限度的解放测试妹妹的双手,当然也会给程序员带来巨大工作量,完整的测试代码估计是项目代码的两倍,另外大家可以自行百度 Xcode Coverage 查看测试代码覆盖率,这篇文章只讲如何在工程中用XCTest框架做单元测试。  其中主要介绍了,用六个按钮示意的UITests使用和性能测试、异步测试的。 二、创建工程: 先创建个名字为 XCTe 阅读详情

相关推荐

iOS 自动化测试(XCTest, UITests)

文章目录前言如何创建自动化测试创建好的自动化测试在哪里?如何使用自动化测试生命周期(运行流程)具体使用介绍初始化 App获取元素根据类型取元素根据 label 取元素根据下标取元素根据 identifier 取元素对元素的操作点击双击长按滑动捏合旋转实际用例具体点击 UITableView 某一行直接打开其他 App系统桌面 App(springboard)申请系统权限, 点击系统权限弹框(例如通...

不知名的上班族-老王 4512

Xcode 5 单元测试(一)使用XCTest进行单元测试

在Objc.io #1的Testing View Controllers中讲解的就是单元测试的相关内容。本文说下如何通过Xcode 5中集成的XCTest框架进行单元测试。首先看看什么是单元测试,然后简单地讲解下XCTest的使用。

Jymn_Chen 2万+

别慌!遇到‘Qwen2Tokenizer does not exist’报错,升级transformers版本就够了吗?

本文深入解析了‘Qwen2Tokenizer does not exist’报错的根源与解决方案,从transformers版本升级到环境隔离、模型文件校验等五大隐藏问题排查指南。通过系统化的调试流程和生产环境最佳实践,帮助开发者彻底解决Tokenizer加载问题,提升大模型应用的稳定性与可靠性。

weixin_30784501的博客 379

iOS 单元测试之XCTest详解(一),iosxctest

http://www.bkjia.com/Androidjc/1023210.html 原创blog,转载请注明出处 blog.youkuaiyun.com/hello_hwc 欢迎关注我的iOS-SDK详解专栏 http://blog.youkuaiyun.com/column/details/huangwenchen-ios-sdk.html 前言:测试是一个好的App不可缺少的部分。

巅峰寂寞. 1076

iOS测试工具全攻略:从XCTest到CI/CD,构建高质量应用防御体系

在软件开发领域,测试是保障产品质量、提升开发效率的核心工程实践。其基本原理是通过分层策略(如测试金字塔模型)系统化地验证代码行为,从底层的单元测试、中层的集成与UI测试,到顶层的端到端测试,每一层都对应不同的技术价值与工具链。对于iOS开发而言,掌握XCTest、Quick/Nimble等单元测试框架,以及OHHTTPStubs、XCTest UI Tests等工具,能够有效隔离依赖、模拟交互并自动化验证功能,从而构建应用的“免疫系统”。这些实践最终服务于提升应用稳定性、减少线上崩溃的核心目标,并自然延伸到

weixin_33985679的博客 283

iOS测试策略实战:从单元测试到CI/CD集成的完整指南

在软件开发中,测试是保障代码质量和应用稳定性的核心实践。其基本原理是通过不同层级的验证,确保从单一函数到完整用户流程的可靠性。测试的技术价值在于构建自动化质量防护网,降低回归成本,提升重构信心。在iOS开发领域,单元测试、集成测试和UI测试构成了经典的测试金字塔模型,它们共同应用于移动应用的质量保障场景。本文以类Simplenote笔记应用为例,深入探讨如何结合XCTest、Quick/Nimble等工具,为业务逻辑编写单元测试,并利用Mockingbird进行依赖隔离。同时,详细介绍了如何将测试策略融入F

weixin_33744854的博客 288

IOS-nRF-Toolbox 安全与测试完整指南:CoreBluetooth 权限、隐私描述与 XCTest 单元测试实践清单

> 本文带你快速掌握 nRF Toolbox 这款 Nordic Semiconductor 官方蓝牙低功耗(BLE)容器应用的 6 个安全配置要点和 3 个 XCTest 单元测试实战技巧。nRF Toolbox 将心率、血糖、血压、Cycling、Nordic UART、DFU 固件升级等一系列 BLE Profile 演示应用收纳在一处,是学习 iOS 蓝牙开发权限声明、隐私描述文案与单元测

gitblog_01096的博客 1034

单细胞分析实战:用R语言绘制带连线的堆叠柱状图(附完整代码)

本文详细介绍了如何使用R语言绘制带连线的堆叠柱状图进行单细胞转录组数据分析,特别适用于展示细胞比例变化趋势。通过完整代码示例和实战技巧,帮助研究者优化多组别比较的可视化效果,提升科研图表质量。

yhn4567890的博客 390

iOS 单元测试怎么跑?用 KXApp 在 VS Code 里跑 XCTest 和 Swift Testing

这篇讲 iOS 单元测试怎么在 KXApp 里跑:VS Code 测试资源管理器如何按 target、类、方法列出 XCTest 和 Swift Testing 用例,单条、整个类、整个 target 三种运行粒度,模拟器与真机切换,失败断言标在出错行,UI 测试的前置条件,以及和 Xcode Test Navigator、xcodebuild test 的分工。也讲清测试面板为空时先检查 Scheme 的测试动作。

2501_91510632的博客 162

Python多版本共存指南:用CMD命令一键切换3.6和3.8解释器(含pip使用技巧)

本文详细介绍了在Windows CMD环境下实现Python多版本(如3.6和3.8)共存与一键切换的完整方案。通过文件重命名策略、环境变量优化和自定义脚本,开发者可快速切换Python解释器版本,并管理各版本独立的pip依赖库,确保项目环境隔离与兼容性。

weixin_29035405的博客 423

【WRF-GHG 教程第一期】概述(Overview)

概述(Overview)

WW、forever的博客 508

iOS静态库代码混淆方案详解:步骤、示例与工具推荐

本文系统讲解iOS静态库代码混淆的必要性与实施方案,涵盖选择混淆工具、配置Build Settings、编写混淆脚本、运行混淆及代码验证等完整流程,并提供基于mangle工具的具体示例。此外,文章还推荐了功能更全面的IpaGuard混淆工具,它无需源码即可对IPA文件进行代码混淆、资源混淆、调试信息清理等操作,支持OC/Swift/Flutter/Unity等多种平台,能有效增加反编译难度,适合企业级iOS应用安全加固。

2501_91373349的博客 210

Playwright实战:打造绕过全维度前端反爬的无头浏览器爬虫(2026实战版)

Playwright绕过前端反爬的核心是模拟真实:真实的设备指纹、真实的行为轨迹、真实的网络请求;2025年前端反爬的核心检测维度是设备指纹+行为轨迹+网络请求,三者缺一不可;实战中需重点关注WebGL/Canvas指纹模拟、行为随机性、请求头完整性,这是绕过反爬的关键;性能优化需以“不触发反爬”为前提,优先选择浏览器复用、资源拦截,而非无限制并发。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2094

iOS Swift单元测试与UI测试实战:从入门到工程化

单元测试和UI测试是移动应用质量保障的核心技术手段。单元测试聚焦于函数与类的逻辑验证,具备执行快、稳定性高、调试精准等优势;UI测试则模拟真实用户操作,用于端到端流程验收。二者需分层协同——以单元测试为基(覆盖核心逻辑)、集成测试为桥(验证模块协作)、UI测试为锚(守住关键路径)。Swift中通过@testable import、协议抽象与Mock机制可构建可测架构,而Accessibility Identifier则是UI测试稳定运行的生命线。本文围绕XCTest与XCUITest框架,系统讲解iOS自动

weixin_29504571的博客 304

ABAP CDS Time Functions 全面解析:用 TIMS_IS_VALID 护航时刻字段的正确性

摘要:本文深入解析ABAP CDS时间函数TIMS_IS_VALID的应用,重点介绍其在企业系统时间字段校验中的关键作用。文章指出无效时间数据会导致业务流程混乱,而CDS层校验能有效减少重复逻辑。详细说明TIMS类型格式要求、空值处理规则,并提供两种工程实现方案:在CDS视图中直接派生校验列,或通过ABAP SQL在内存表中批量验证。最后给出可直接运行的代码示例,包括一个ABAP报表演示内存表验证,以及一个CDS View Entity实现系统时间自动映射与校验,帮助开发者在业务场景中快速落地时间校验功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 193

【入门AUTOSAR网络管理测试】CANoe测试T_WakeUp时间

随着智能电动汽车行业的快速发展,目前AUTOSAR网络管理也得到了广泛应用,AUTOSAR网络管理测试也是汽车网络测试中非常重要的环节,NM问题导致的汽车ECU不能唤醒、电瓶亏电等问题,对于新入门AUTOSAR网络管理测试的同学不清楚如何开展测试,那么本章节就主要给大家介绍网络管理中T_WakeUp时间如何测试。【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读。

测试领域技术分享 2135

Harpy单元测试完全指南:确保版本检测的准确性

Harpy是一款用于通知用户应用新版本可用并提示升级的工具,其核心功能是版本检测与更新提示。为确保版本检测的准确性和可靠性,完善的单元测试至关重要。本文将详细介绍Harpy单元测试的实现方式、核心测试场景及最佳实践,帮助开发者全面掌握单元测试要点。 ## 单元测试基础:环境与工具准备 Harpy的单元测试基于XCTest框架实现,测试文件位于`HarpyExample/HarpyExample

gitblog_00804的博客 678

nvidia系列教程-AGX-Orin基础环境搭建

NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台,专为需要高性能和低功耗的边缘计算应用设计。无论是自动驾驶、机器人,还是智能监控系统,Jetson AGX Orin 都能为这些应用提供强大的计算能力。本篇博客将为大家详细介绍如何在AGX Orin(32GB)上搭建基础开发环境,包括系统安装、CUDA和cuDNN的配置等,帮助你快速上手这个强大的平台。架构: 搭载 56 个 Tensor Core 的 1792 核 NVIDIA Ampere c GPUCUDA Cores。

flypig has a dream! 2796

Kiwix测试指南:单元测试与XCUITest自动化测试实战

**Kiwix** 是一款支持 iOS、iPadOS 与 macOS 的开源离线阅读器,让你在没有网络的情况下也能浏览完整的维基百科内容。本篇文章是面向测试新手的 **Kiwix 测试指南**,带你从零认识这个开源项目里的**单元测试**与 **XCUITest 自动化测试**:测试文件放在哪里、每个用例在验证什么、以及如何在本地运行它们。读完这篇实战教程,你将掌握一套可复用的 iOS/macOS

gitblog_00078的博客 750

【占用网络】OccNet: Scene as Occupancy 适用于检测、分割和规划任务 ICCV2023

本文分享“占用网络”方案中,具有代表性的方法:OccNet。它以多视角视觉为核心,首先生成BEV特征,然后通过级联结构和时间体素解码器重建生成3D占用特征。构建一个通用的“3D占用编码特征”,用以表示3D物理世界。这样的特征描述可以应用于广泛的自动驾驶任务,包括检测、分割和规划。

黎国溥 3360

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

测试开发—XCTest-iOS单元测试框架

XCTest 是iOS的单元测试框架,有objective-c和swift两种语言可以选择 XCUITest 是iOS的UI测试框架 XCTest 官方文档地址:https://developer.apple.com/documentation/xctest XCTest 框架类似于python中的unit test框架,声明一个测试case继承XCTestCase和测试方法,测试方法以test开头,然后执行。 相关类介绍: Class XCTest XCTest类提供XCTest...

Try My Best! 1873

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

老司机 iOS 周报 #9

老司机 iOS 周报,只为你呈现有价值的信息。 文章 [译]奔跑吧!RunLoop! 揭示了 RunLoop 的本质和 RunLoop 的执行过程。翻译有一些瑕疵,喜欢阅读英文的朋友可以直接看原文。 [译] 揭秘 iOS 布局 详细全面介绍了界面布局的相关函数的执行顺序和作用。 [译]为什么你的 APP 在 Sketch 上看起来更好: 探索 Sketch 和 iOS 的渲染差异 如果你非常严格的...

weixin_33973609的博客 302

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: iOS单元测试
下一篇: Swift之可选型
runtime666
博客等级 码龄10年 41粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值