iOS架构设计

手动埋点、自动化埋点、可视化埋点

手动埋点、自动化埋点和可视化埋点是iOS应用中常用的数据采集方法。它们各有特点和适用场景,下面我会对它们进行详细介绍。

手动埋点

手动埋点是指开发人员在代码中主动插入埋点代码来采集需要的数据。开发人员需要在触发事件的具体方法中添加代码来记录相关信息,并根据上报策略将数据上传到后台。手动埋点的优点是灵活性高,可以根据具体需求自定义采集的数据内容和上报方式。但是手动埋点也存在一些问题,比如新增埋点需要发版、埋点代码和业务代码耦合等[1]

自动化埋点

自动化埋点是通过自动化工具来实现数据采集,无需手动插入埋点代码。自动化埋点工具会自动监测应用的页面加载、点击等事件,并自动嵌入监测代码来采集数据。自动化埋点的优点是减少了开发人员的工作量,无需手动插入埋点代码。但是自动化埋点也存在一些问题,比如数据量巨大、数据清洗难度大等[1]

可视化埋点

可视化埋点是通过可视化工具来进行数据采集配置。开发人员可以使用可视化工具圈选具体页面元素,并生成配置信息。在用户操作时,可视化埋点工具会根据配置判断是否需要采集该事件。可视化埋点的优点是配置方便快捷,无需手动编写代码。可视化埋点也可以解决手动埋点中的一些问题,比如新增埋点不需要发版、降低了埋点代码和业务代码的耦合等。但是可视化埋点也需要解决一些问题,比如如何确定页面元素的唯一标识、如何携带业务参数等[1]

综上所述,手动埋点、自动化埋点和可视化埋点都是iOS应用中常用的数据采集方法,它们各有优缺点和适用场景。开发人员可以根据具体需求选择合适的埋点方式来进行数据采集。


Learn more:

  1. iOS自动化埋点探索 - 简书
  2. 埋点治理:如何把App埋点做到极致? - 掘金
  3. iOS可视化埋点设计方案 | 伴鱼技术团队

MVC、MVP、MVVM设计模式

在iOS开发中,常用的设计模式包括MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)。这些设计模式都有各自的特点和适用场景。

  1. MVC(Model-View-Controller) MVC是苹果官方推荐的架构模式。它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。
  • 模型(Model):负责处理应用程序的数据逻辑,包括数据的获取、处理和存储。
  • 视图(View):负责展示数据给用户,并接收用户的输入。
  • 控制器(Controller):作为模型和视图之间的中介,负责处理用户的输入、更新模型数据,并将更新后的数据展示在视图上。

MVC的优点是能够将应用程序的逻辑和界面分离,使代码更加清晰和易于维护。然而,随着业务逻辑的增加,控制器可能会变得臃肿,导致维护成本增加[1]

  1. MVP(Model-View-Presenter) MVP是对MVC模式的一种演进版本。它将视图(View)和控制器(Controller)分离为视图(View)和展示器(Presenter)两个部分。
  • 模型(Model):同MVC模式中的模型,负责处理数据逻辑。
  • 视图(View):负责展示数据给用户,并接收用户的输入。
  • 展示器(Presenter):作为模型和视图之间的中介,负责处理用户的输入、更新模型数据,并将更新后的数据展示在视图上。

MVP的优点是进一步解耦了视图和业务逻辑,使得视图可以独立于模型进行修改。同时,展示器可以单独测试业务逻辑,提高代码的可测试性[2]

  1. MVVM(Model-View-ViewModel) MVVM是由微软提出的一种架构模式。它将视图(View)和控制器(Controller)合并为视图(View)和视图模型(ViewModel)两个部分。
  • 模型(Model):同MVC和MVP模式中的模型,负责处理数据逻辑。
  • 视图(View):负责展示数据给用户,并接收用户的输入。
  • 视图模型(ViewModel):作为模型和视图之间的中介,负责处理用户的输入、更新模型数据,并将更新后的数据展示在视图上。

MVVM的优点是能够将视图的状态和行为抽离出来形成一个新的抽象,使得业务逻辑和业务展示分离,提高代码的可维护性和重用性[1]

综上所述,MVC、MVP和MVVM都是常用的iOS设计模式,每种模式都有其适用的场景和优缺点。选择合适的设计模式可以提高代码的可维护性和可测试性,使开发更加高效。


Learn more:

  1. iOS 设计模式 浅析MVC、MVP、MVVM - 掘金
  2. [译]iOS架构模式--解密MVC、MVP、MVVM和VIPER - 掘金
  3. iOS 设计模式 浅析MVC、MVP、MVVM - 简书

常见的设计模式

在iOS开发中,常见的设计模式有以下几种:

  1. 单例模式:单例模式可以保证系统中一个类只有一个实例,常用于共享资源的场景。在iOS中,一些常见的单例对象包括UIApplication、NSNotificationCenter、NSFileManager、NSUserDefaults等[1]

  2. 工厂模式:工厂模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。在iOS中,类簇的使用是工厂模式的一种应用,如NSNumber、NSArray、NSString等[1]

  3. 装饰模式:装饰模式可以动态地给一个对象增加一些额外的功能,而不改变原有对象。在iOS中,Category是一种变相的装饰者模式,可以为原来的类添加方法[1]

  4. 代理模式:代理模式为某个对象提供一个代理,并由代理对象控制对原对象的访问。在iOS中,常见的代理模式应用包括UITableViewDelegate、UITextFieldDelegate等[1]

  5. 观察者模式:观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在iOS中,NSNotificationCenter是一种观察者模式的实现,可以实现不同对象之间的消息传递[1]

  6. 命令模式:命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。在iOS中,常见的命令模式应用包括UIControl的Target-Action机制、NSOperationQueue等[1]

  7. 享元模式:享元模式通过共享对象来减少内存使用,提高性能。在iOS中,常见的享元模式应用包括NSCache、NSURLCache等[1]

这些设计模式在iOS开发中都有广泛的应用,可以根据具体的需求选择合适的设计模式来解决问题。


Learn more:

  1. iOS中究竟用到了哪些设计模式 - 掘金
  2. 🐻iOS设计模式 - 掘金
  3. iOS最实用的13种设计模式(全部有github代码) - 简书

常见的路由方案,以及优缺点对比

iOS常见的路由方案主要包括基于URL类型的路由和基于runtime类型的路由。下面是对这两种路由方案的优缺点对比:

  1. 基于URL类型的路由方案:

    • 原理:借鉴前端Router和系统App内跳转的方式,通过URL来完成路由请求。将URL和页面对应关系保存到一个注册表,路由的过程就是通过URL查找对应的页面[2].
    • 优点:
      • 服务器可以动态控制页面跳转,实现灵活的页面管理。
      • 可以统一处理iOS、Android、H5/RN/Weex等多端的请求方式。
    • 缺点:
      • 需要在load方法中注册,影响App启动速度。
      • URL涉及硬编码,参数不易维护。
      • 对象类型参数需要使用字典实现[2].
    • 常见第三方库:JLRoutes, Routable-ios, HHRouter, ALRouter[2].
  2. 基于runtime类型的路由方案:

    • 原理:基于Mediator模式和Target-Action模式,利用Objective-C的runtime特性来完成调用。根据路由信息中的target和action,生成target实例,调用对应的action操作,完成路由[2].
    • 优点:
      • 无需注册,充分利用Runtime的特性。
      • 统一组件调用入口,简化组件间的调用关系。
      • 有校验保证安全,对URL进行验证[2].
    • 缺点:
      • 涉及硬编码,部分参数需要打包成字典。
    • 常见第三方库:CTMediator[2].

综上所述,基于URL类型的路由方案适合需要灵活管理页面跳转的场景,而基于runtime类型的路由方案则更适合统一组件调用入口的场景。


Learn more:

  1. iOS 路由方案对比 - 掘金
  2. iOS 路由总结大全 - 简书
  3. iOS 组件化 -- 路由设计思路分析

如何保证iOS项目的稳定性

保证iOS项目的稳定性是一个重要的目标,以下是一些常见的方法和实践来提高iOS项目的稳定性:

  1. 单元测试和集成测试:编写全面的单元测试和集成测试,覆盖项目中的关键功能和边界情况,确保代码的正确性和稳定性。

  2. 持续集成和持续交付:使用持续集成和持续交付工具,自动化构建、测试和部署过程,确保每次代码提交都经过自动化测试,并能够快速部署到生产环境。

  3. 错误监控和日志记录:集成错误监控工具,如Crashlytics、Sentry等,及时捕获和记录应用程序的崩溃和异常情况,以便快速定位和修复问题。

  4. 性能优化:进行性能分析和优化,确保应用程序在各种设备和网络条件下都能够稳定运行,并提供良好的用户体验。

  5. 内存管理和资源释放:合理管理内存和资源的使用,避免内存泄漏和资源浪费,及时释放不再使用的对象和资源。

  6. 异常处理和容错机制:在关键的业务逻辑中添加异常处理和容错机制,防止因异常情况导致应用程序崩溃或功能无法正常运行。

  7. 安全性考虑:在开发过程中注重安全性,避免常见的安全漏洞和攻击,如输入验证、数据加密等。

  8. 版本控制和代码审查:使用版本控制系统管理代码,确保代码的可追溯性和可恢复性。进行代码审查,发现和修复潜在的问题和错误。

  9. 更新和维护:及时更新依赖库和框架,修复已知的漏洞和问题。持续进行代码重构和优化,提高代码的可读性和可维护性。

  10. 用户反馈和用户体验:积极收集用户反馈,及时响应和解决用户遇到的问题,改进用户体验,提高用户满意度。

通过以上的方法和实践,可以提高iOS项目的稳定性,减少潜在的问题和风险,确保应用程序能够稳定运行并提供良好的用户体验。

如何设计一个git diff

如何设计一个git diff

Git diff是用于比较代码之间差异的工具。设计一个git diff需要考虑以下几个方面:

  1. 选择比较的范围:你可以选择比较两个commit之间的差异,或者比较两个分支之间的差异。根据你的需求,选择合适的比较范围。

  2. 选择输出格式:Git diff可以以不同的格式输出差异信息,如patch格式、统计信息格式等。根据你的需求,选择合适的输出格式。

  3. 选择比较的算法:Git diff提供了多种比较算法,如默认算法、patience算法、histogram算法等。根据你的需求,选择合适的比较算法。

  4. 选择显示的上下文:Git diff可以显示差异的上下文,你可以选择显示多少行的上下文信息。根据你的需求,选择合适的上下文显示。

  5. 选择输出的内容:Git diff可以输出差异的详细信息,如修改的行数、添加的行数、删除的行数等。根据你的需求,选择合适的输出内容。

下面是一些常用的git diff命令和选项:

  • git diff:比较工作区和暂存区之间的差异。
  • git diff --cached:比较暂存区和最新提交之间的差异。
  • git diff commit1 commit2:比较两个commit之间的差异。
  • git diff branch1 branch2:比较两个分支之间的差异。
  • git diff --stat:以统计信息的形式显示差异。
  • git diff --color-words:以单词为单位显示差异,并使用颜色标记。

Learn more:

  1. Create patch or diff file from git repository and apply it to another different git repository - Stack Overflow
  2. Git Diff | Atlassian Git Tutorial
  3. Git - git-diff Documentation

设计一个线程池?画出你的架构图

在iOS中设计一个线程池,可以使用GCD(Grand Central Dispatch)来实现。下面是一个简单的线程池设计架构图:

diff 复制代码
+-------------------+
|    Task Queue     |
+-------------------+
|                   |
|                   |
|                   |
|                   |
+-------------------+
         |
         |
         v
+-------------------+
|    Thread Pool    |
+-------------------+
|                   |
|                   |
|                   |
|                   |
+-------------------+

架构图解释:

  • Task Queue(任务队列):用于存储待执行的任务,可以是串行队列或并发队列。任务可以是闭包(block)或自定义的操作对象(Operation)。
  • Thread Pool(线程池):由多个线程组成的池子,用于执行任务队列中的任务。线程池可以是固定大小的,也可以是动态调整大小的。

线程池的设计思路:

  1. 创建一个任务队列,用于存储待执行的任务。
  2. 创建一个线程池,包含多个线程,用于执行任务队列中的任务。
  3. 当有任务需要执行时,将任务添加到任务队列中。
  4. 线程池中的线程从任务队列中获取任务并执行。
  5. 执行完任务后,线程返回线程池,等待下一个任务。

线程池的设计可以根据具体需求进行调整,例如可以设置最大线程数、线程的优先级等。


Learn more:

  1. 理解iOS中的线程池
  2. 线程池_ProcessOn思维导图流程图
  3. iOS刨根问底-深入理解GCD - KenshinCui - 博客园

你的app架构是什么,有什么优缺点、为什么这么做、怎么改进

app架构是基于MVVM(Model-View-ViewModel)的设计模式。

优点:

  • 分离关注点:MVVM将数据逻辑和界面逻辑分离,使得代码更加清晰和可维护。
  • 可测试性:ViewModel中的业务逻辑可以通过单元测试进行验证,提高代码质量和稳定性。
  • 可复用性:ViewModel可以独立于具体的视图实现,可以在不同的界面中重用。
  • 响应式编程:通过使用观察者模式和绑定机制,ViewModel可以实时更新视图,提供更好的用户体验。

缺点:

  • 学习曲线:相比传统的MVC(Model-View-Controller)架构,MVVM需要更多的学习和理解。
  • 引入额外的复杂性:MVVM引入了额外的组件,如ViewModel和绑定机制,增加了代码的复杂性。
  • 项目规模限制:对于小型项目,MVVM可能会显得过于繁琐,不适合简单的应用。

为什么选择MVVM架构:

  • 分离关注点:MVVM将数据逻辑和界面逻辑分离,使得代码更加清晰和可维护。
  • 可测试性:ViewModel中的业务逻辑可以通过单元测试进行验证,提高代码质量和稳定性。
  • 可复用性:ViewModel可以独立于具体的视图实现,可以在不同的界面中重用。
  • 响应式编程:通过使用观察者模式和绑定机制,ViewModel可以实时更新视图,提供更好的用户体验。

如何改进:

  • 模块化:将应用拆分为多个模块,每个模块负责特定的功能,提高代码的可维护性和可复用性。
  • 使用依赖注入:通过依赖注入框架,将依赖关系解耦,提高代码的灵活性和可测试性。
  • 引入统一的数据管理:使用统一的数据管理机制,如Redux或RxSwift,来管理应用的状态和数据流,简化数据处理逻辑。

Learn more:

  1. 优秀的 iOS 应用架构:MVVM、MVC、VIPER,孰优孰劣?
  2. iOS应用架构谈 组件化方案 - Casa Taloyum
  3. 对于做App架构设计的一些思考-阿里云开发者社区

其他问题

哪些bug会导致崩溃,如何防护崩溃

iOS常见导致崩溃的bug及防护方法如下:

  1. Container Crash(容器类崩溃):

    • 常见的容器类崩溃包括数组越界、插入nil等错误操作[1]
    • 防护方法:自定义方法进行交换,并在自定义方法中加入条件限制和判断,避免越界和插入nil的情况发生[1]
  2. NSString Crash(字符串类崩溃):

    • 字符串类崩溃可能由于空指针、越界等操作引起[1]
    • 防护方法:在使用字符串的方法前,先进行非空判断,避免空指针引起的崩溃[1]
  3. 找不到对象方法或者类方法:

    • 当调用一个不存在的对象方法或者类方法时,会导致崩溃[1]
    • 防护方法:在调用方法前,先进行方法是否存在的判断,避免调用不存在的方法[1]
  4. KVO和KVC Crash:

    • 错误使用KVO(键值观察)和KVC(键值编码)可能导致崩溃[1]
    • 防护方法:正确使用KVO和KVC,遵循相关规范,避免错误操作引起的崩溃[1]
  5. NSNotification Crash:

    • 错误使用NSNotification可能导致崩溃,如未移除观察者或者观察者被释放后仍然发送通知[1]
    • 防护方法:在适当的时候移除观察者,避免观察者被释放后仍然接收通知[1]
  6. NSTimer Crash:

    • 错误使用NSTimer可能导致崩溃,如未及时释放或者重复启动定时器[1]
    • 防护方法:在适当的时候释放定时器,避免重复启动定时器[1]
  7. Bad Access Crash(野指针):

    • 野指针访问内存可能导致崩溃[1]
    • 防护方法:在使用指针前进行有效性检查,避免野指针访问[1]
  8. Threading Crash(非主线程刷新UI):

    • 在非主线程刷新UI可能导致崩溃[1]
    • 防护方法:在主线程中刷新UI,避免在非主线程中操作UI[1]
  9. NSNull Crash:

    • 错误使用NSNull可能导致崩溃,如将NSNull当作其他类型的对象使用[1]
    • 防护方法:在使用NSNull前进行类型判断,避免错误使用NSNull[1]
  10. iOS16上的Crash:

    • iOS16上可能存在新的崩溃问题,需要根据具体情况进行防护[1].

以上是iOS常见导致崩溃的bug及防护方法。通过合理的防护措施,可以降低应用程序的崩溃率,提升应用的稳定性和用户体验。


Learn more:

  1. iOS-各种Crash防护 - 掘金
  2. iOS Crash防护 - 掘金
  3. ios崩溃分析

怎么监控崩溃

在iOS中,可以使用以下方法来监控崩溃:

  1. 使用崩溃日志收集工具:有一些第三方工具可以帮助你收集崩溃日志,例如Bugly、Firebase Crashlytics等。这些工具可以自动捕获崩溃日志并上传到服务器进行分析和监控。

  2. 注册信号处理函数:iOS中的崩溃通常是由信号引起的,你可以注册信号处理函数来捕获崩溃信号并进行处理。通过注册signalHandler函数来捕获异常信号,然后在处理函数中获取堆栈信息并进行保存或上传[1]

  3. 使用异常处理机制:iOS中的异常处理机制可以帮助你捕获和处理异常情况。你可以使用@try-@catch-@finally语法块来捕获异常,并在@catch块中处理异常情况。在异常处理块中,你可以记录异常信息、保存堆栈信息等[2]

  4. 使用崩溃分析工具:Xcode提供了崩溃分析工具,可以帮助你分析崩溃日志。你可以使用Xcode的"Organizer"功能来查看应用程序的崩溃日志,并获取符号化的堆栈信息。这些信息可以帮助你定位和解决崩溃问题[1]

总结: 监控iOS崩溃可以使用崩溃日志收集工具、注册信号处理函数、使用异常处理机制或使用崩溃分析工具。这些方法可以帮助你及时发现和解决应用程序的崩溃问题,提高应用程序的稳定性和用户体验。


Learn more:

  1. 如何监控iOS的崩溃问题 - 掘金
  2. [史上最全] iOS Crash/崩溃/异常 捕获 - 简书
  3. 如何全面监控 iOS 千奇百怪的崩溃-腾讯云开发者社区-腾讯云

app的启动过程(考察LLVM编译过程、静态链接、动态链接、runtime初始化)

iOS应用的启动过程可以分为以下几个阶段:

  1. 编译阶段:

    • 使用LLVM编译器将源代码编译成可执行文件(Mach-O格式)[1]
    • 静态链接:将应用程序的目标文件与系统库和其他依赖库进行链接,生成最终的可执行文件[1]
  2. 动态链接阶段:

    • 在应用启动时,动态链接器(dyld)会加载应用程序的可执行文件和依赖的动态库[1]
    • dyld会递归加载应用程序所有依赖的动态库,并进行符号绑定和偏移修正[1]
    • 符号绑定:将应用程序中的符号与动态库中的实际地址进行绑定,使得应用程序能够正确调用动态库中的函数和方法[1]
    • 偏移修正:将应用程序中的地址偏移值与运行时分配的ASLR地址相加,得到真实的内存地址[1]
  3. 运行时初始化阶段:

    • ObjC的runtime初始化:注册ObjC相关的类、category,检查selector的唯一性等[1]
    • 执行+load()方法:在动态库加载后,会调用每个类的+load()方法,用于执行一些初始化操作[1]
    • 执行attribute((constructor))修饰的函数:这些函数会在应用启动时自动执行,用于执行一些初始化操作[1]
  4. main()阶段:

    • dyld调用main()函数,开始执行应用程序的主逻辑[1]
    • 调用UIApplicationMain()函数,创建UIApplication对象和AppDelegate对象[1]
    • 调用applicationWillFinishLaunching和didFinishLaunchingWithOptions方法,完成应用程序的初始化,并展示首页[1].

Learn more:

  1. iOS应用的启动流程和优化详解 - 掘金
  2. ios-app的启动流程分析 - 知乎
  3. iOS App启动优化(一)-- 了解App的启动流程 - 掘金

沙盒目录的每个文件夹划分的作用

沙盒目录是iOS系统中用于存储应用程序数据的文件夹。每个文件夹在沙盒目录中都有特定的作用。以下是沙盒目录中每个文件夹的划分作用:

  1. Documents目录:

    • 用途:用于存储应用程序的用户数据文件。
    • 特点:该目录下的文件会被iTunes同步,可以通过配置实现iTunes共享文件[1]
  2. Library目录:

    • 用途:存放应用程序的支持文件和偏好设置文件。
    • 子目录:
      • Caches目录:用于存放应用程序专用的支持文件,如缓存图片、离线数据等。该目录下的数据不会被iTunes同步,系统不会自动清理其中的文件。
      • Preferences目录:包含应用程序的偏好设置文件,可以通过NSUserDefaults类来取得和设置应用程序的偏好。该目录下的数据会被iTunes同步[1]
  3. tmp目录:

    • 用途:用于存放临时文件,如临时下载的文件等。
    • 特点:该目录下的文件不会被iTunes同步,系统会自动清理其中的文件,例如在重新启动手机时[1]

这些文件夹的划分使得应用程序能够按照不同的需求将数据存储在不同的位置,并且能够控制哪些数据会被iTunes同步,哪些数据会被系统自动清理。


Learn more:

  1. iOS 沙盒目录结构及正确使用 - 简书
  2. iOS-沙盒文件目录 - 掘金
  3. iOS沙盒存储的基本使用 - 掘金

简述下match-o文件结构

Mach-O文件结构是苹果操作系统(OSX和iOS)使用的可执行文件格式。它是一种二进制文件格式,用于存储代码和数据,并定义了程序文件的组成和链接规则。了解Mach-O文件结构对于理解苹果操作系统的底层机制以及程序的链接和加载过程非常重要。

Mach-O文件由以下几个部分组成:

  1. 文件头(Mach Header):包含了该二进制文件的一般信息,如字节顺序、架构类型、加载指令的数量等[1]

  2. 加载命令(Load Commands):是一个包含多个加载命令的表,用于描述文件的各个部分的位置和属性,如区域的位置、符号表、动态符号表等[1]

  3. 数据区(Data):通常是对象文件中最大的部分,包含了各个段(Segment)的具体数据[1]

具体来说,Mach-O文件的结构如下:

  1. 文件头(Mach Header):包含了文件的一般信息,如字节顺序、架构类型、加载指令的数量等。

  2. 加载命令(Load Commands):是一个包含多个加载命令的表,描述了文件的各个部分的位置和属性。

  3. 数据段(Segment):存放数据,包括代码、字符常量、类、方法等。一个Mach-O文件可以有多个数据段,每个段可以包含多个区域(Section)。

  4. 符号表(Symbol Table):将地址和符号联系起来的桥梁,存储了符号在字符串表中的位置。

  5. 字符串表(String Table):存储了所有的变量名、函数名等字符串。

  6. 动态符号表(Dynamic Symbol Table):存储了动态链接的符号在符号表中的偏移信息。

以上是Mach-O文件的基本结构,更详细的了解可以参考官方文档和相关资料。


Learn more:

  1. 详解 Mach-O 文件结构 - 简书
  2. 聊聊 Mach-O 文件格式 | geneblue's blog
  3. Mach-O文件结构 - 掘金
相关推荐
测试19986 小时前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试
马剑威(威哥爱编程)7 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试
独行soc9 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
理想不理想v9 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
sszmvb123410 小时前
测试开发 | 电商业务性能测试: Jmeter 参数化功能实现注册登录的数据驱动
jmeter·面试·职场和发展
测试杂货铺10 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
王佑辉10 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
真忒修斯之船10 小时前
大模型分布式训练并行技术(三)流水线并行
面试·llm·aigc
ZL不懂前端11 小时前
Content Security Policy (CSP)
前端·javascript·面试
测试界萧萧11 小时前
外包干了4年,技术退步太明显了。。。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展