Skip to content

30AB测试:如何用AB测试协助产品抉择?

你有没有遇到过花了很大精力和时间开发出来的功能却得不到用户认同的尴尬情况?其实,这往往是产品决策方向错误导致的。目前流行的产品抉择方法有以下几种。

第一种是由产品经理根据经验和个人喜好来决定,据说乔布斯就是这种类型的产品决策者。他认为无论做出怎样的产品,用户都会买账,所以他可以根据自己的喜好来决定产品的方向。市场上有不少这一类型的产品经理,可是乔布斯只有一个,由于个人认知的局限性,这些产品经理没有办法保证每个决定都是正确的。

那怎样才能避开因个人喜好而导致决策错误的"坑"呢?这就引出了第二种产品抉择的办法------用户调研。用户调研是通过问卷或者面谈的方式来挖掘用户的需求,这种方法对于面向特定群体的 App 会比较有效,例如面向 HR 流程的企业 App,我们可以根据多个 HR 的回答或反馈来筛选出产品需求。

可是对于面向大众的 App,用户调研往往就很难保证其有效性了,因为会面临诸多问题,比如,调研的问题设计是否合理?所调研的用户是否具有代表性?用户在回答问题时是否如实所想?等等。

那怎样才能进一步提高产品抉择的有效性呢?这就是今天我们要讲的第三种办法------A/B 测试

A/B 测试是把用户随机地分成两个或以上的组别,并为各组分发同一功能的不同版本,然后根据留存率、点击率等指标来选择最佳版本。 A/B 测试的概念来源于生物医学的双盲测试。在双盲测试中,我们把病人在不知情的情况随机分成两组,一组使用需要测试的药物,另一组是不使用任何药物的控制组,然后对比两组病人的表现是否具有显著的差异,从而决定测试药物是否有效。

因此,App 的 A/B 测试有以下三个特征。

  1. A/B 测试需要大量的样本。由于 A/B 测试成本相对比较低,所以我们可以很方便地把测试推送给大量的用户,从而排除结果的偶然性。

  2. A/B 测试分组的用户特征需要保持一致。例如,不能把 A 版本只分发给女性用户,B 版本只分发给男性用户,而是要把不同版本无差异地分发给同类用户群,这样才能保证测试的公正性。

  3. A/B 测试用户需要在不知情的情况下执行测试。因为一些"额外"的信息可能会影响到用户的思考和习惯,而用户在不知情的情况下,他们就可以很"自然"地按照自身的行为习惯与 App 进行交互,这样就能保证我们收集到用户的真实想法了。

A/B 测试是一种提升用户体验的有效方法。通过 A/B 测试,我们可以把用户交互非常频繁的版本保留下来,并在该版本的基础上不断迭代。同时,A/B 测试也能协助产品经理做出抉择,保证产品方向的正确性。

下面我们就以 Moments App 作为例子来看看如何架构和实现 A/B 测试模块吧。

A/B 测试模块的架构与实现

首先我们来看一下 A/B 测试模块的架构图,如下所示:

A/B 测试模块依赖于 Remote Config 模块 ,而 Remote Config 模块在上一讲中我们已经介绍过了,如有记不清的地方你可以再复习一下。为了支持新的 A/B 测试案例,我们在FirebaseRemoteConfigKey里面增加了一个新的 case,如下代码所示:

swift
enum FirebaseRemoteConfigKey: String, RemoteConfigKey {
    case isRoundedAvatar
    case likeButtonStyle // 新增用于 A/B 测试的 case
}

在 Moments App 里面,我们想通过 A/B 测试来找出哪种点赞按钮的风格更受欢迎。因此,在 A/B 测试模块里面,我们定义了一个枚举类型来表示不同的按钮风格,如下代码所示:

swift
enum LikeButtonStyle: String {
    case heart, star
}

LikeButtonStylerawValue是字符串类型。因为我们希望测试的按钮风格为心形和星形,所以分别定义了heartstar两个 case。

有了测试案例以后,我们就可以定义如下的协议:

swift
protocol ABTestProvider {
    var likeButtonStyle: LikeButtonStyle? { get }
}

ABTestProvider协议包含了所有需要测试的案例,例如,当前需要测试点赞按钮的风格,我们就定义了likeButtonStyle属性。

接着看一下FirebaseABTestProvider的具体实现:

swift
struct FirebaseABTestProvider: ABTestProvider {
    static let shared: FirebaseABTestProvider = .init()
    private let remoteConfigProvider: RemoteConfigProvider
    private init(remoteConfigProvider: RemoteConfigProvider = FirebaseRemoteConfigProvider.shared) {
        self.remoteConfigProvider = remoteConfigProvider
    }
    var likeButtonStyle: LikeButtonStyle? {
        guard let likeButtonStyleString = remoteConfigProvider.getString(by: FirebaseRemoteConfigKey.likeButtonStyle) else {
            return nil
        }
        return LikeButtonStyle(rawValue: likeButtonStyleString)
    }
}

FirebaseABTestProvider依赖了RemoteConfigProvider来读取 Firebase 的 A/B 测试配置,因此我们在init()方法中通过依赖注入的方式传进了FirebaseRemoteConfigProvider的实例,并赋值给remoteConfigProvider属性。同时,由于FirebaseABTestProvider遵循了ABTestProvider协议,所以必须实现likeButtonStyle属性。在likeButtonStyle属性的代码实现里,我们通过调用remoteConfigProvider.getString(by:)方法取出来自 Firebase 后台配置的点赞按钮风格字符串,然后把该字符串传递给LikeButtonStyleinit(rawValue:)方法进行初始化。假如按钮风格的字符串为空,那likeButtonStyle就会返回nil

就这样,我们就完成了 A/B 测试模块的开发,如果我们需要添加其他的测试案例,只需要在ABTestProvider添加一个新的属性,并在FirebaseABTestProvider里实现该新属性即可。

A/B 测试的使用与配置

下面我们继续以likeButtonStyle为例子看看如何使用 A/B 测试模块

在 App 里面使用 A/B 测试非常简单,仅仅需要两步。例如,在MomentListItemView里测试点赞按钮的风格,第一步是在init()方法,通过依赖注入的方式把ABTestProvider子类型的实例传递进去,具体代码如下:

swift
private let abTestProvider: ABTestProvider
init(frame: CGRect = .zero, ..., abTestProvider: ABTestProvider = FirebaseABTestProvider.shared) {
    self.abTestProvider = abTestProvider
    super.init(frame: frame)
}

因为 Moments App 使用了 Firebase 作为 A/B 测试服务,所以我们就把FirebaseABTestProvider的实例赋值给abTestProvider属性。

第二步是通过检查abTestProviderlikeButtonStyle属性来控制 UI 的显示,其代码如下:

swift
switch abTestProvider.likeButtonStyle {
case .heart:
    favoriteButton.asHeartFavoriteButton()
case .star:
    favoriteButton.asStarFavoriteButton()
case .none:
    // 如果 Firebase 后台没有配置该属性
    favoriteButton.asHeartFavoriteButton()
}

likeButtonStyle属性返回heart时,我们调用 DesignKit 里面的asHeartFavoriteButton()方法来把按钮变成心形。当likeButtonStyle属性返回star时,我们就调用asStarFavoriteButton()方法来把按钮变成星形。

看完如何使用 A/B 测试模块以后,接下来我们再来看看如何在 Firebase 后台配置 A/B 测试

首先,我们要打开 Remote Config 页面,并为点赞按钮风格的测试案例里添加一个新配置,如下图里名为 "likeButtonStyle"的配置。

然后在 A/B Testing 页面里点击"Create experiment"按钮,并选择"Remote Config"选项,接下来就可以按照下面罗列的四个步骤来配置一个新 A/B 测试案例了。

第一步是填写测试案例的名称,如下图所示,我们添加了一个名叫"点赞按钮风格"的案例。

第二步是配置需要测试的 App ID,以及测试的覆盖率。基于 App 的用户基数,我们一般选择 1% 到 10% 的用户进行测试。

第三步是配置测试的指标,例如点击率、留存率等。

第四步是配置测试版本(Variant),例如把基础版本配置为心形,而 A 版本设置为星形。

操作完这四个步骤以后,就可以点击"Start experiment"按钮来启动测试案例了。

我们还可以配置测试运行时长,例如一到三个月,当测试运行完毕以后,就能看到测试报告,如下图所示:

根据报告的结果,我们就能发现哪种按钮风格更受欢迎,然后就可以保留胜出的版本,并移除其他版本。

总结

在这一讲中,我们讲述了如何架构和实现 A/B 测试模块,并且我们还以 Firebase 为例子演示了如何测试不同风格版本的点赞按钮。总之,A/B 测试能很好地协助我们进行产品决策。

下面我再分享下我使用 A/B 测试过程中的一些经验。进行 A/B 测试的用户样本必须足够大 ,否则很容易出现误差。同时,测试过程中一般只分发给 1% 到 10% 的用户 ,在得到结论后才推广到所有的用户。另外,当你得到测试结果时,最好及时删除整个测试案例,在 App 里面只保留胜出的版本。

至此,课程模块四的内容我们就全部讲完了。这个模块由两部分组成:前半部分主要讲述如何使用 fastlane 和 CI 来自动化证书管理、打包和签名,以及上传 App Store 等重复性操作;而后半部分则讲述了如何架构灵活的统计分析、崩溃报告、远程开关以及 A/B 测试模块,并且还为这些模块提供了 Firebase 的实现。如果你的 App 是面向海外市场的,Firebase 是一个不错的选择,它不但可以免费使用,而且简单易用、功能丰富。

思考题

我们讲了三种产品抉择的方法,请问你一般是使用哪种办法来进行产品抉择的?能分享一下你的经验吗?

请把你的思考与答案写到留言区哦。从下一讲开始就进入加餐部分了,我会先介绍"如何使用 Figma 快速制作 App Icon"的相关内容,记得按时来听课哦。

源码地址

A/B 测试源码地址:https://github.com/lagoueduCol/iOS-linyongjian/tree/main/Moments/Moments/Foundations/ABTest