一款Salesforce测试工具: Apex Test Kit

这里给大家介绍一款Salesforce测试数据生成工具Apex Test Kit

每个Salesforce开发者最终都无法逃避的一个事情就是给测试类造假数据。Apex Test kit可以帮组我们快速的创建测试数据。它提供的主要功能有以下三点:

1. 给假数据起一个好听的名字,而不是用name001, email001@example.com这样看起来很机器化的命名。

2. 给必填字段赋值,并为唯一字段建立唯一性命名规则。

3. 建立多对多对象间的关系,中间可能牵扯到任意多的对象。

1. ATKWizard类

我们先依次为Microsoft,Google,Apple循环创建100条Account,每个Account下有两条Contact。我们可以使用field()关键字干涉数据生成规则。

ATKWizard me = new ATKWizard();
me.wantMany('Account')
    .total(100)
    .fields(new Map<String, Object> {
        'Name' => new List<String> {
            'Microsoft-{{###}}',
            'Google-{{###}}',
            'Apple-{{###}}'
        },
        'Fax' => '{{1##-###-####}}'
    })
    .hasMany('Contact')
        .referenceBy('AccountId')
        .total(200)
        .fields(new Map<String, Object> {
            'FirstName' => '{!name.firstName(female)}',
            'LastName' => '{!name.lastName}'
        })
    .generate();

下面是以上代码生成的数据,无法识别语义的文字段落用的是业界惯用的希腊语:


生成的Account数据
生成的Contact数据

2. 建立复杂关系

大家可能会好奇,这个库对于复杂的对象关系最难可以做到什么程度。举一个CloudCraze(被Salesforce收购的B2B电商平台)中的常用对象关系:


CloudCraze数据模型

我们可以用一句话把数据都生成出来。为了演示效果,去除了不必要的field()关键字。

ATKWizard me = new ATKWizard();
ATKWizard.Bag bag = me.wantMany('Account')
    .total(2)
    .belongsTo('ccrz__E_AccountGroup__c')
        .referenceBy('ccrz__E_AccountGroup__c')
        .total(2)
        .hasMany('ccrz__E_AccountGroupPriceList__c')
            .referenceBy('ccrz__AccountGroup__c')
            .total(4)
            .belongsTo('ccrz__E_PriceList__c')
                .referenceBy('ccrz__Pricelist__c')
                .total(2)
                .hasMany('ccrz__E_PriceListItem__c')
                    .referenceBy('ccrz__Pricelist__c')
                    .total(4)
                    .belongsTo('ccrz__E_Product__c')
                        .referenceBy('ccrz__Product__c')
                        .total(2)
                        .hasMany('ccrz__E_ProductMedia__c')
                            .referenceBy('ccrz__Product__c')
                            .total(6)
    .generate();

我们还可以对生成的数据使用同样的语法做后期处理。我们可以从ATKWizard.Bag中取到已生成的数据。

me.wantMany('ccrz__E_Product__c')
    .fromList(bag.get('ccrz__E_Product__c'))
    .fields(new Map<String, Object> {
        'ccrz__ProductStatus__c' => 'Released'
    })
    .generate();

3. ATKFaker类

ATKFaker是faker.js在Salesforce平台下的移植,它是数据生成的基石。底层使用UserInfo.getLanguage() 侦测生成数据的语言。目前只支持英文。中文和日语正在逐步支持中。

ATKFaker.internet.userName();
ATKFaker.internet.email();
ATKFaker.internet.url();
ATKFaker.internet.avatar();
ATKFaker.phone.phoneNumber();
ATKFaker.phone.phoneNumber('1xx-xxx-xxxx');
ATKFaker.name.firstName();
ATKFaker.name.firstName('male');
ATKFaker.name.firstName('female');
ATKFaker.name.lastName();
ATKFaker.random.boolean();
ATKFaker.random.number(); // => 0-999
ATKFaker.random.number(99); // number(max) => 0-99
ATKFaker.random.number(5, 2); // number(precesion, scale) => 123.45
ATKFaker.lorem.words();
ATKFaker.lorem.sentences();
ATKFaker.lorem.paragraphs();
ATKFaker.dates.past();
ATKFaker.dates.past(3, '2018-08-13');
ATKFaker.dates.future()
ATKFaker.dates.future(3, '2018-08-13');
ATKFaker.dates.between('2017-08-13', '2018-08-13');

4. ATKFaker动态插值

跟faker.js类似,以上的所有帮助方法都可以用在插值(interpolation)语句中。使用 {! } Visualforce格式插入帮助方法:

ATKFaker.fake('Hello {!name.firstName(female)} {!name.lastName}!');
// => 'Hello Jeff Jin!'

使用 {{ }} Handlebars格式插入符号, #代表数字,?代表字母,*代表数字或字母:

ATKFaker.fake('{{###-###-####}}'); // => '123-456-7890'

4. ATKWizard的设计

好的类库都会源自简单的设计。本类库的设计思想来源于法师使用魔法的过程:

  1. 打开魔法书ATKSpellBook,开始咏唱符文,说出您的愿望:hasMany(), belongsTo(), fields()等。
  2. 挥舞魔法棒。执行我们的愿望,建立对象,关联关系:generate()。


    Apex Test Kit 核心类

5. 限制

目前有两种图结构不支持,等library稳定了才会考虑。

  1. 不支持sObject有2个以上的父亲:


    多个父亲

所以请不要用also()关键字构建以上对象想关系,多数情况请使用hasMany()来接also()关键字,而不是用belongsTo():

ATKWizard me = new ATKWizard();
me.wantMany('D')
    .belongsTo('A')
    .also()
    .belongsTo('B')
    .also()
    .belongsTo('C')
    .generate();
  1. 不支持有向无环图


    有向无环

目前的语法和底层也不支持这种结构。

还有一些后续的任务需要完善,比如:

  1. 移植更多的faker.js领域语言和翻译。
  2. 性能优化,特别是字符串拼接,没有StringBuilder可用。
  3. 处理未发现的bug等。

小结

Apex Test Kit还在beta测试阶段,预计2018年10月分可以上线。欢迎参与,提Bug,和给星星。给您带来的方便就是我持续的动力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容