在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这里简单的共享一下测试替身。 当我们写测试代码的时候,经常遇到一个问题。 因此 测试替身Test Double的分以下类型。 Dummy, Stub, Fake, Spy, Mock Dummy最简单、最原始的测试替身型别。Dummy 没有实作,最常用于需要参数值但不使用它的情况。 StubDummy 的上一级,Stub 是接口或基类的最低限度实作。 Spy测试 Spy 类似 Stub,但除了提供客户端可叫用成员的实例, FakeFake 包含更复杂的实作,通常涉及所继承型别之不同成员之间的互动。 MockMock 是由 Mock 链接库动态建立 (其他通常是由测试开发人员使用程序代码来产生)。
我开发的是在企业微信中的应用,所以需要调用企业微信的API, 我是这么处理的。 项目初期(一阶段)直接写 一般我们都会说尽量避免写硬代码hardcode, 例子: var key string if config.AppEnv == "test" || config.AppEnv == "dev" { //测试或是开发环境的时候直接赋值 key = "23836728366" } else { key, err = (Login{}).GetKeyForLogin(ctx, code) //实际调用的接口写在这里 if err != nil { return nil, err } } 项目中期(二阶段)硬代码hardcode 可以写根据参数或设定返回不同值的方法。满足不同场景下有不同返回值的需求。 例子: var key string if config.AppEnv == "test" || config.AppEnv == "dev" { key = GetKeyForLoginForTest(ctx, code) //测试或是开发环境的时候直接赋值 } else { key, err = (Login{}).GetKeyForLogin(ctx, code) //实际调用的接口写在这里 if err != nil { return nil, err } } func GetKeyForLoginForTest(ctx context.Context, code string) string { var key string switch code { case "code1": key = "key1" case "code2": key = "key2" case : ...... default: key = "key3" } return key } 项目后期(三阶段)函数function升 这个阶段是可选项,因为这里开始需要耗精力去管理自己的“替身”了。 例子: type LoginTest interface { GetKeyForLoginForTest(ctx context.Context, code string) string } type SellerTest struct { } func (SellerTest) GetKeyForLoginForTest(ctx context.Context, code string) string { //销售员业务处理... return "SellerKey" } type ManagerTest struct { } func (ManagerTest) GetKeyForLoginForTest(ctx context.Context, code string) string { //业务处理... return "ManagerKey" } func BuildManagedObject(ctx context.Context, condition string) string { switch condition { case "condition1": return SellerTest{} case "condition2": return ManagerTest{} case : ...... default: return SellerTest{} } } var key string if config.AppEnv == "test" || config.AppEnv == "dev" { var loginTest LoginTest loginTest = BuildManagedObject(condition) key = loginTest.GetKeyForLoginForTest(ctx, code) //测试或是开发环境的时候直接赋值 } else { key, err = (Login{}).GetKeyForLogin(ctx, code) //实际调用的接口写在这里 if err != nil { return nil, err } } 这么做其实能解决大部分的问题。
组员不愿意写测试代码而找借口的时候你可以这么说了…^^
----------------------------------------------
欢迎大家的意见和交流
email: [email protected]
博客:https://limingxie.github.io/
|
请发表评论