如何在 iOS swift 中制作登录屏幕的单元测试用例

     2023-02-24     279

关键词:

【中文标题】如何在 iOS swift 中制作登录屏幕的单元测试用例【英文标题】:How can i make unit test cases of Login screen in iOS swift 【发布时间】:2019-05-02 09:33:16 【问题描述】:

我在登录屏幕上遇到问题。如何使用登录屏幕制作单元测试用例?我有一个带有操作按钮的用户名和密码屏幕。单击按钮并制作一些单元测试用例时,我需要调用 API。请给我一些信息。提前致谢。

【问题讨论】:

我建议您模拟您的网络请求,以便您可以一致地控制预期的响应,然后测试是否完成了正确的操作 【参考方案1】:

最简单的方法是构建您的代码,使其实际上不会启动登录 API 调用。相反,它:

创建请求,但在发送前停止 处理响应

然后您可以测试填写字段并点击按钮会创建正确的请求。之后,您可以测试各种响应,包括在端到端测试中难以创建的各种错误情况。

要从单元测试中点击按钮,请使其测试可以访问该按钮。然后拨打sendActions(for: .touchUpInside)


示例:有很多方法可以构建它。假设我们有一个协议

protocol NetworkCalling 
    typealias CallResult = Result<(Data, URLResponse), Error>
    typealias CompletionHandler = (CallResult) -> Void

    func call(request: URLRequest, completionHandler: @escaping CompletionHandler)

我们的视图控制器将使用它给出的任何东西。它不在乎。它只知道如何从其属性中生成 URLRequest。它还知道如何处理结果,无论是成功还是失败。

class ViewController: UIViewController 
    var networkCall: NetworkCalling?
    
    @IBAction private func login(sender: AnyObject) 
        let request = URLRequest(url: URL(string: "http://foo.bar?baz")!)
        networkCall?.call(request: request)  [weak self] result in
            self?.handleResult(result)
        
    

    private func handleResult(_ result: NetworkCalling.CallResult) 
        switch result 
        case let .success(data, response):
            break
        case let .failure(error):
            break
        
    

协议引入了一个边界。视图控制器看不到那个边界。这不是视图控制器的业务。该协议让我们有机会提供不同的实现者:

可以进行真正的网络调用的东西。 包装另一个实现者的装饰器,进行日志记录。 一个为单元测试捕获其参数的测试间谍。 为 UI 测试重放已存储响应的伪造品。这使 UI 测试更快、更可靠。

【讨论】:

你能分享一个登录屏幕的例子吗? 添加了一个例子。【参考方案2】:

您可以通过发送不同的用户名和密码参数来编写多个测试用例。

错误的用户名和密码应该会给您错误消息,然后您可以检查您是否收到错误消息而不是成功消息。

输入正确的用户名和密码应该会给您成功消息作为响应。

使用 XCTAssertEqual 比较消息。

这个屏幕上可能会有更好的 UITest 用例。

【讨论】:

你能分享任何例子吗@Huned【参考方案3】:

虽然这个问题似乎有点宽泛,但让我提一些有用的观点:

在单元测试中,我们关心场景的功能,而不是关心可视化 UI 组件——例如——。那么,您对登录测试有何看法:

点击按钮时我需要调用 API 并制作一些单元 测试用例。

有效,是场景中的主要功能之一。

您应该专注于测试您的代码,而不是 API 本身。换句话说,您的测试用例应该以您期望某个响应(例如成功或失败)的方式实现,因此收到它时应该发生什么,这意味着不要尝试测试 API 响应本身(我们是不在这里做集成测试),你应该关心你的代码基于响应的行为。

关于以上几点,如何应用呢?您可以遵循“模拟”响应的方法。简而言之,您可以做的是为使用的网络管理器创建包含相同行为的模拟类,因此您可以将接收到的结果(假设)硬编码为 - 例如 - 失败的成功,从而测试接收到的“应该发生什么”嘲笑”的结果。

【讨论】:

如何在swift ios中调整集合视图单元格的高度?

】如何在swiftios中调整集合视图单元格的高度?【英文标题】:Howtoadjustcollectionviewcellheightinswiftios?【发布时间】:2018-03-1210:42:45【问题描述】:我的单元格包含标签和文本视图,我想调整文本视图的高度单元格高度也应该调整。... 查看详情

如何在 Swift 中截取 UITableView 中选定行的屏幕截图并将其保存为 UIImage?

】如何在Swift中截取UITableView中选定行的屏幕截图并将其保存为UIImage?【英文标题】:HowcanItakeascreenshotofselectedrowsinUITableViewinSwiftandsaveitasanUIImage?【发布时间】:2017-04-1520:50:02【问题描述】:在我的Swift应用程序中,我有一个UITabl... 查看详情

如何在 iOS Swift 中将选定的 tableView 单元格保存到数组中?

】如何在iOSSwift中将选定的tableView单元格保存到数组中?【英文标题】:HowtosaveselectedtableViewcellintoarrayiniOSSwift?【发布时间】:2019-08-2416:15:11【问题描述】:我有一个列出静态数组值的表格视图。可以在表格视图中进行多项选择... 查看详情

如何在 swift iOS Firestore 中获取单元格文档 ID?

】如何在swiftiOSFirestore中获取单元格文档ID?【英文标题】:HowtogetthepostcelldocumentIdinswiftiOSFirestore?【发布时间】:2019-09-2006:04:13【问题描述】:下面是我正在处理的代码,有用于cmets列表的tableview和tablecells,当我单击单元格中的... 查看详情

如何在 CollectionView iOS Swift 4 中显示不显示单元格的标题?

】如何在CollectionViewiOSSwift4中显示不显示单元格的标题?【英文标题】:HowtoshowHeaderwithoutshowCellinCollectionViewiOSSwift4?【发布时间】:2018-12-1720:22:38【问题描述】:我有Cell、Header和Footer的集合视图。我的数据源中的某些索引没有包... 查看详情

Swift iOS -CollectionView 如何将单元格滚动到屏幕外

】SwiftiOS-CollectionView如何将单元格滚动到屏幕外【英文标题】:SwiftiOS-CollectionViewhowtoscrollcellsoffofscreen【发布时间】:2018-06-0918:01:24【问题描述】:我有一个包含4个单元格的collectionView。由于集合视图内只有4个单元格,因此不会... 查看详情

如何制作登录流程IOS应用

】如何制作登录流程IOS应用【英文标题】:HowtomakealoginflowIOSapp【发布时间】:2015-10-3002:02:08【问题描述】:我使用FacebookSDK在我的应用程序中通过Facebook登录。基本上我有一个登录屏幕,当用户单击“Facebook”按钮时,它会执行... 查看详情

如何制作 swift listView 轮盘动画 [关闭]

】如何制作swiftlistView轮盘动画[关闭]【英文标题】:HowtomakeswiftlistViewrouletteanimation[closed]【发布时间】:2020-12-0914:48:57【问题描述】:美好的一天!我正在尝试实现这样的动画功能。也许你看到了这样的东西。具有轮盘赌行为的... 查看详情

如何在swift ios中制作UIbutton正方形的顶部边缘

】如何在swiftios中制作UIbutton正方形的顶部边缘【英文标题】:HowtomaketopedgesofaUIbuttonsquareinswift3ios【发布时间】:2017-07-1906:03:12【问题描述】:@IBOutletweakvarbutton:UIButton!overridefuncviewDidLoad()button.layer.borderWidth=0.5button.layer.cornerR 查看详情

如何在iOS swift中自动登录用户?

】如何在iOSswift中自动登录用户?【英文标题】:HowtologinuserautomaticallyiniOSswift?【发布时间】:2018-11-1103:55:08【问题描述】:我正在使用CloudFirestore进行电话身份验证。在firestoredb中,我正在存储用户电话号码和uid。这是我尝试过... 查看详情

如何在swift ios中对齐tableview单元格中的文本

】如何在swiftios中对齐tableview单元格中的文本【英文标题】:Howtoaligntextintableviewcellinswiftios【发布时间】:2018-08-1512:28:57【问题描述】:我正在使用firebase在iosswift中开发一个聊天应用程序。我能够成功发送和检索消息。但问题是... 查看详情

带有 Swift 和 iOS 8 故事板的登录屏幕

】带有Swift和iOS8故事板的登录屏幕【英文标题】:LoginScreenwithSwiftandiOS8Storyboard【发布时间】:2015-05-0306:15:55【问题描述】:我在处理我的iOS应用程序的登录流程时遇到了很多麻烦。下面是我想要实现的情节提要的图像我正在尝... 查看详情

Swift iOS - 如何在按下单元格之前从 TableView 的所有 IndexPath 中获取数据

】SwiftiOS-如何在按下单元格之前从TableView的所有IndexPath中获取数据【英文标题】:Swift3iOS-HowtogetDatafromAllIndexPathsfromTableViewBeforeCellIsPressed【发布时间】:2017-07-1921:28:44【问题描述】:我跟着AshFurrows教程collectionViewinsidetableView我有... 查看详情

iOS:如何在 SwiftUI 页面顶部制作我的图像徽标

】iOS:如何在SwiftUI页面顶部制作我的图像徽标【英文标题】:iOS:HowtomakemyimagelogoatthetopofthepageSwiftUI【发布时间】:2021-06-1211:09:11【问题描述】:首先,我对iOS开发和Swift非常陌生(从PHP来到这里2周:))我正在构建我的简单登录页... 查看详情

iOS如何从表格视图单元格Swift中的解析下载图像

】iOS如何从表格视图单元格Swift中的解析下载图像【英文标题】:iOSHowtodownloadimagefromparseintableviewcellSwift【发布时间】:2018-04-1311:49:48【问题描述】:我处理一个项目,我需要在表格视图单元格中显示图像,我在解析数据库中拥... 查看详情

如何在 iOS Swift 中制作加载动画?

】如何在iOSSwift中制作加载动画?【英文标题】:HowtomakeloadinganimationiniOSSwift?【发布时间】:2020-06-0505:49:26【问题描述】:嗨,我想用3UIView制作动画。主要问题是我无法通过从layer中删除动画来停止动画。代码如下:classHTAnimatedT... 查看详情

如何在 swift 中制作动画(xcode 6 beta)

】如何在swift中制作动画(xcode6beta)【英文标题】:howtoanimatestuffinswift(xcode6beta)【发布时间】:2014-06-0811:13:47【问题描述】:我想知道如何用苹果的新语言swift为事物制作动画。在目标c中,我将使用以下代码将图像从屏幕顶部移... 查看详情

如何在可扩展的表格视图单元中制作动态集合视图

】如何在可扩展的表格视图单元中制作动态集合视图【英文标题】:Howtomakedynamiccollectionviewinsideexpendabletableviewcell【发布时间】:2020-05-1106:41:24【问题描述】:我必须在表格视图可调整大小的单元格内制作一个带有动态集合视图... 查看详情