今日工作任务:
1. 更新客户代码合并提交到我们代码库
2. 理解feizhi补上的单元测试代码,针对MnPriceApprovalForm的
3. 额外有时间学习下单元测试的概念
2. 理解feizhi补上的单元测试代码,针对MnPriceApprovalForm的
3. 额外有时间学习下单元测试的概念
salesforce中apex代码的测试流程。
1.定义测试类,注明@isTest注解
@isTest public class MnPriceApprovalFormControllerTest { }
2.定义测试类中的测试数据类
@isTest public class MnPriceApprovalFormControllerTest { private static Integer APPROVAL_LEVELS_IN_THIS_TEST = 3; public class TestData { public User localUser1, regionUser1, globalUser1, submitterUser1, adminUser1; public MnCountry__c country; public MnProduct__c family, family2; public MnProductSKU__c product1, product2; public MnPrice__c productPricing1, productPricing2; public MnPriceType__c globalPriceLevel; public MnCountryPriceType__c priceLevel; public MnCountryProductSKU__c countryProductSKU1, countryProductSKU2; public TestData() { TestDataCreator.createUsers( new List<Map<String, Object>> { new Map<String, Object> { TestDataCreator.USER_USERNAME => 'LocalUser1@testorg.com', TestDataCreator.USER_LOCALE => 'en_US', TestDataCreator.PROFILE_NAME => 'GPM_Standard_User', TestDataCreator.PERMISSION_SET_NAME => 'GPM_FOUNDATION' }, new Map<String, Object> { TestDataCreator.USER_USERNAME => 'RegionUser1@testorg.com', TestDataCreator.USER_LOCALE => 'en_US', TestDataCreator.PROFILE_NAME => 'GPM_Standard_User', TestDataCreator.PERMISSION_SET_NAME => 'GPM_FOUNDATION' }, new Map<String, Object> { TestDataCreator.USER_USERNAME => 'GlobalUser1@testorg.com', TestDataCreator.USER_LOCALE => 'en_US', TestDataCreator.PROFILE_NAME => 'GPM_Standard_User', TestDataCreator.PERMISSION_SET_NAME => 'GPM_ADMIN' }, new Map<String, Object> { TestDataCreator.USER_USERNAME => 'SubmitterUser1@testorg.com', TestDataCreator.USER_LOCALE => 'en_US', TestDataCreator.PROFILE_NAME => 'GPM_Standard_User', TestDataCreator.PERMISSION_SET_NAME => 'GPM_FOUNDATION' }, new Map<String, Object> { TestDataCreator.USER_USERNAME => 'AdminUser1@testorg.com', TestDataCreator.USER_LOCALE => 'en_US', TestDataCreator.PROFILE_NAME => 'System Administrator', TestDataCreator.PERMISSION_SET_NAME => 'GPM_ADMIN' } } ); localUser1 = TestDataCreator.getUser('LocalUser1@testorg.com'); regionUser1 = TestDataCreator.getUser('RegionUser1@testorg.com'); globalUser1 = TestDataCreator.getUser('GlobalUser1@testorg.com'); submitterUser1 = TestDataCreator.getUser('SubmitterUser1@testorg.com'); adminUser1 = TestDataCreator.getUser('AdminUser1@testorg.com'); // Configure Data system.runAs(globalUser1) { List<MnPrice__c> prices = TestDataCreator.createPrices( new List<Map<String, Object>> { new Map<String, Object> { TestDataCreator.COUNTRY_NAME => 'TestCountry', TestDataCreator.COUNTRY_ISO_CODE => 'C1', TestDataCreator.CURRENCY_ISO_CODE => 'USD', TestDataCreator.COUNTRY_MULTICURRENCY_ENABLED => true, TestDataCreator.REGION_NAME => 'TestRegion', TestDataCreator.PRODUCT_SKU_NAME => 'TestProduct1', TestDataCreator.PRODUCT_NAME => 'TestFamily', TestDataCreator.PRICE_TYPE_NAME => 'Ex-Manufacturer', TestDataCreator.COUNTRY_PRODUCT_SKU_CURRENT_STATUS => 'Approved But Not Marketed', TestDataCreator.PRICE => 10, TestDataCreator.PRICE_START_DATE => system.today().addMonths(-1), TestDataCreator.PRICE_END_DATE => null }, new Map<String, Object> { TestDataCreator.COUNTRY_NAME => 'TestCountry', TestDataCreator.COUNTRY_ISO_CODE => 'C1', TestDataCreator.CURRENCY_ISO_CODE => 'USD', TestDataCreator.COUNTRY_MULTICURRENCY_ENABLED => true, TestDataCreator.REGION_NAME => 'TestRegion', TestDataCreator.PRODUCT_SKU_NAME => 'TestProduct2', TestDataCreator.PRODUCT_NAME => 'TestFamily', TestDataCreator.PRICE_TYPE_NAME => 'Ex-Manufacturer', TestDataCreator.COUNTRY_PRODUCT_SKU_CURRENT_STATUS => 'Approved But Not Marketed', TestDataCreator.PRICE => 200, TestDataCreator.PRICE_START_DATE => system.today().addMonths(-1), TestDataCreator.PRICE_END_DATE => null }, new Map<String, Object> { TestDataCreator.COUNTRY_NAME => 'TestCountry', TestDataCreator.COUNTRY_ISO_CODE => 'C1', TestDataCreator.CURRENCY_ISO_CODE => 'USD', TestDataCreator.COUNTRY_MULTICURRENCY_ENABLED => true, TestDataCreator.REGION_NAME => 'TestRegion', TestDataCreator.PRODUCT_SKU_NAME => 'TestProduct3', TestDataCreator.PRODUCT_NAME => 'TestFamily2', TestDataCreator.PRICE_TYPE_NAME => 'Ex-Manufacturer', TestDataCreator.COUNTRY_PRODUCT_SKU_CURRENT_STATUS => 'Actively Marketed', TestDataCreator.PRICE => 200, TestDataCreator.PRICE_START_DATE => system.today().addMonths(-1), TestDataCreator.PRICE_END_DATE => null } } ); country = TestDataCreator.getCountry('TestCountry'); family = TestDataCreator.getProduct('TestFamily'); family2 = TestDataCreator.getProduct('TestFamily2'); priceLevel = TestDataCreator.getCountryPriceType('TestCountry','Ex-Manufacturer'); product1 = TestDataCreator.getProductSKU('TestProduct1'); product2 = TestDataCreator.getProductSKU('TestProduct2'); countryProductSKU1 = TestDataCreator.getCountryProductSKU('TestCountry','TestProduct1'); countryProductSKU2 = TestDataCreator.getCountryProductSKU('TestCountry','TestProduct2'); productPricing1 = prices[0]; productPricing2 = prices[1]; } // Configure Data Visibility system.runAs(globalUser1) { GPUserManager.setAsynchronous(false); // local and region users have access to all products MnUserConfig__c submitterUserConfig = new MnUserConfig__c( User__c=submitterUser1.Id, ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS ); MnUserConfig__c localUserConfig = new MnUserConfig__c( User__c=localUser1.Id, ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS ); MnUserConfig__c regionUserConfig = new MnUserConfig__c( User__c=regionUser1.Id, ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS ); MnUserConfig__c globalUserConfig = new MnUserConfig__c( User__c=globalUser1.Id, ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS, RegionAccess__c=GPUserManager.PICKLIST_OPTION_EDIT, PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED ); insert new List<MnUserConfig__c>{submitterUserConfig,localUserConfig,regionUserConfig,globalUserConfig}; // local and submitter users have edit access to country MnUserCountry__c submitterUserCountry = new MnUserCountry__c( MnUserConfig__c=submitterUserConfig.Id, MnCountry__c=country.Id, Access__c=GPUserManager.PICKLIST_OPTION_EDIT, PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED ); MnUserCountry__c localUserCountry = new MnUserCountry__c( MnUserConfig__c=localUserConfig.Id, MnCountry__c=country.Id, Access__c=GPUserManager.PICKLIST_OPTION_EDIT, PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED ); insert new List<MnUserCountry__c>{submitterUserCountry,localUserCountry}; // region user has edit access to region MnUserRegion__c regionUserRegion = new MnUserRegion__c( MnUserConfig__c=regionUserConfig.Id, MnRegion__c=TestDataCreator.getRegion('TestRegion').Id, Access__c=GPUserManager.PICKLIST_OPTION_EDIT, PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED ); // local user has read access to TestRegion MnUserRegion__c localUserRegion = new MnUserRegion__c( MnUserConfig__c=localUserConfig.Id, MnRegion__c=TestDataCreator.getRegion('TestRegion').Id, Access__c=GPUserManager.PICKLIST_OPTION_READ, PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED ); insert new List<MnUserRegion__c> {regionUserRegion, localUserRegion}; } // Configure Approvers system.runAs(globalUser1) { MnApprover__c approver1 = new MnApprover__c( MnApprover__c=localUser1.Id, MnCountry__c=country.Id, MnProduct__c=family.Id, Level__c=1 ); MnApprover__c approver2 = new MnApprover__c( MnApprover__c=regionUser1.Id, MnCountry__c=country.Id, MnProduct__c=family.Id, Level__c=2 ); MnApprover__c approver3 = new MnApprover__c( MnApprover__c=globalUser1.Id, MnCountry__c=country.Id, MnProduct__c=family.Id, Level__c=3 ); insert new List<MnApprover__c>{approver1,approver2,approver3}; } } }
TestDataCreator类是自己创建的类
public class TestDataCreator { public static final String PROFILE_NAME = 'profileName'; public static final String PERMISSION_SET_NAME = 'permissionSetName'; public static final String USER_ALIAS = 'userAlias'; public static final String USER_EMAIL = 'userEmail'; public static final String USER_EMAIL_ENCODING = 'userEmailEncoding'; public static final String USER_LAST_NAME = 'userLastName'; public static final String USER_FIRST_NAME = 'userFirstName'; public static final String USER_USERNAME = 'userUsername'; public static final String USER_LOCALE = 'userLocale';
system.runAs(globalUser1)方法的作用:Changes the current user to the specified user.
注:测试数据不会添加到数据库中,因此不会存在存留问题,不需要delete操作。这个测试数据具体是怎么做的有时间可以研究下。
3.定义测试方法
static testMethod void testCreateNewPriceApproval() { TestData td = new TestData(); MnPriceApprovalPrice__c price = new MnPriceApprovalPrice__c( MnCountry__c=td.country.Id, MnProduct__c=td.family.Id, MnCountryProductSKU__c=td.countryProductSKU1.Id, MnCountryPriceType__c=td.priceLevel.Id, ProposedPrice__c=9, StartDate__c=DateTime.newInstance(Date.today(), Time.newInstance(0, 0, 0, 0)).addDays(2) ); Test.startTest(); User thisUser = [ select Id from User where Id = :UserInfo.getUserId() ]; System.runAs ( thisUser ){ MnCustomSetting__c cs = new MnCustomSetting__c( Name='PriceRequest_SKUTableColumns', Value__c='MnCountryPriceType__c.Published__c,read,MnCountryPriceType__c.Name,read, MnPriceApprovalPrice__c.FinalPercent__c,edit, MnPriceApprovalPrice__c.CurrencyIsoCode,edit'); insert cs; } System.runAs(td.submitterUser1) { PageReference paPage = Page.PriceApproval; paPage.getParameters().put(MnPageParameters.PRODUCT_ID_PARAM, td.family.Id); paPage.getParameters().put(MnPageParameters.COUNTRY_ID_PARAM, td.country.Id); Test.setCurrentPage(paPage); MnPriceApproval__c newPriceApproval = new MnPriceApproval__c( MnProduct__c=td.family.Id, MnCountry__c=td.country.Id ); // test constructor MnPriceApprovalFormController extension = new MnPriceApprovalFormController(); extension.setPriceApproval(newPriceApproval); System.assertEquals(true, extension.isExistExtraColumn()); System.assertEquals(4, extension.getSKUTableCustomCells(td.priceLevel, td.countryProductSKU1, price).size()); System.assertEquals(td.family.Id,extension.product.Id); System.assertEquals(td.country.Id,extension.country.Id); System.assertEquals(MnPriceApprovalFormController.SUBMIT_CONFIRMATION_MESSAGE,extension.getSubmitConfirmationMessage()); System.assertEquals(MnPriceApprovalFormController.DELETE_CONFIRMATION_MESSAGE,extension.getDeleteConfirmationMessage()); // check prices System.assertEquals(2,extension.priceApprovalPrices.size()); System.assertEquals(2,extension.productSKURows.size()); MnPriceApprovalFormController.ProductSKURow productSKURow = extension.productSKURows[0]; System.assertEquals(td.countryProductSKU1.Id,productSKURow.countryProductSKU.Id); System.assertEquals(1,productSKURow.priceTypeRows.size()); MnPriceApprovalFormController.PriceTypeRow priceTypeRow = productSKURow.priceTypeRows[0]; System.assertEquals(td.productPricing1.Price__c,priceTypeRow.currentPrice.Price__c); // save extension.getPriceApproval().ExpectingResponseDate__c = Date.today().addDays(1); priceTypeRow.approvalPrice.ProposedPrice__c = 9; priceTypeRow.approvalPrice.StartDate__c = DateTime.newInstance(Date.today(), Time.newInstance(0, 0, 0, 0)).addDays(2); extension.onSave(); MnPriceApproval__c priceApproval = MnPriceApprovalService.getApproval(extension.getPriceApproval().Id); System.assertEquals(9,priceApproval.MnPriceApprovalPrices__r[0].ProposedPrice__c); extension.setPriceApproval(priceApproval); System.assertEquals(true,extension.getIsSubmitter()); System.assertEquals(false,extension.getIsApprover()); System.assertEquals(true,extension.getSaveButtonRendered()); System.assertEquals(true,extension.getSubmitButtonRendered()); System.assertEquals(false,extension.getRecallButtonRendered()); System.assertEquals(false,extension.getFinalizeButtonRendered()); System.assertEquals(false,extension.getApproveRejectButtonRendered()); System.assertEquals(false,extension.getSubmittedDateRendered()); System.assertEquals(false,extension.getRejectSKURendered()); // delete extension.onDelete(); List<MnPriceApproval__c> priceApprovals = [SELECT Id FROM MnPriceApproval__c]; System.assertEquals(0,priceApprovals.size()); // start over and submit newPriceApproval = new MnPriceApproval__c( MnProduct__c=td.family.Id, MnCountry__c=td.country.Id ); extension = new MnPriceApprovalFormController(); extension.setPriceApproval(newPriceApproval); productSKURow = extension.productSKURows[0]; priceTypeRow = productSKURow.priceTypeRows[0]; extension.getPriceApproval().PriceChangeType__c='type1'; extension.getPriceApproval().PriceChangeReason__c='reason1'; extension.getPriceApproval().PriceChangeFlexibility__c='flex1'; extension.getPriceApproval().ExpectingResponseDate__c = Date.today().addDays(1); productSKURow.countryProductSKU.CurrentStatus__c = 'Actively Marketed'; priceTypeRow.approvalPrice.ProposedPrice__c = 9; priceTypeRow.startDate.ExpectingResponseDate__c = Date.today().addDays(2); extension.onSave(); extension.onSubmit(); priceApproval = MnPriceApprovalService.getApproval(extension.getPriceApproval().Id); System.assertEquals(9,priceApproval.MnPriceApprovalPrices__r[0].ProposedPrice__c); System.assertEquals('Actively Marketed',priceApproval.MnPriceApprovalPrices__r[0].CurrentStatus__c); System.assertEquals(MnPriceApprovalService.APPROVAL_STATUS_PENDING,priceApproval.ApprovalStatus__c); // then recall // TODO: // PageReference paPage = Page.PriceApproval; // paPage.getParameters().put('Id', priceApproval.Id); // Test.setCurrentPage(paPage); // ApexPages.StandardController controller = new ApexPages.StandardController(new MnPriceApproval__c()); // MnPriceApprovalFormController extension = new MnPriceApprovalFormController(controller); // exension.onRecall(); // priceApproval = MnPriceApprovalService.getApproval(extension.priceApproval.Id); // System.assertEquals(MnPriceApprovalService.APPROVAL_STATUS_RECALLED,priceApproval.ApprovalStatus__c); } Test.stopTest(); }
注:Test.startTest(),表示开始测试;Test.stopTest(),表示结束测试。
System.assertEquals(true, extension.isExistExtraColumn())为断言,这样就相当于测试了类中的方法或变量。
测试覆盖率需要达到75%。
每个类都应该拥有相应的测试类。
测试的难点就在于:测试数据的构造,以及给相应的方法传递怎样的数据。