1.유닛 테스트를 통해 다음과 같은 이점을 얻을 수 있다.
- 클래스 및 트리거가 예상대로 작동하는지 확인 가능
- 회귀 테스트 도구 모음을 통해 향후 업데이트에도 사용 가능
- 코드 범위 요구 사항 충족 확인 가능
- 고품질 앱으로 생산성을 높이고 신뢰를 높일 수 있음
2.sfdc에서는 75%이상의 테스트 적용 범위를 요구하지만
최대한 100%를 목적으로 테스트를 작성해야 하며
모든 테스트 메서드를 작성한다고 하더라도 100%가 되지 않을 수 있다.
아래에는 추가적인 주의사항이다.
- 조직 데이터에 접근하기 위해서는 @isTest가 아닌 @isTest(SeeAllData=true)를 사용해야 한다.
- 조직에는 최대 6MB의 코드를 저장할 수 있지만 @isTest 주석이 달린 코드는 이 제한에서 제외한다.
- 고유한 제약 조건이 있는 필드가 있는 일부 sObject의 경우 중복 sObject 레코드를 삽입하면 오류가 발생한다.
- 테스트 메서드에서는 이메일을 보낼 수 없다.
- 외부 서비스에 대한 콜아웃을 만들 수 없고 모의 콜아웃만 사용할 수 있다.
- 테스트에서 수행된 SOSL 검색은 빈 결과를 반환하기 떄문에 Test.setFixedSearchResults()로 값을 정의해줘야 한다.
3.Apex 유닛 테스트 통과 코드
@isTest
private class TestVerifyDate {
@isTest static void testTaskPriority() {
Date a = Date.newInstance(2023, 4, 12);
Date b = a.addDays(29);
Date pri = VerifyDate.CheckDates(a, b);
System.assertEquals(b, pri);
}
@isTest static void testTaskHighPriority() {
Date a = Date.newInstance(2023, 4, 12);
Date b = a.addDays(30);
Date c = Date.newInstance(2023, 4, 30);
Date pri = VerifyDate.CheckDates(a, b);
System.assertEquals(c, pri);
}
}
//진행이 안되서 문제점을 찾아보니 private에 접근을 하지 못하기 때문이었다.
//테스트를 진행할 때는 private을 작동시키는 public 메서드의 분기 조건을 파악하고
//해당 분기 조건이 모든 private을 작동시킬 수 있게 다양한 접근으로 테스트를 진행해야 한다.
//다른 문제 형식으로 Test를 붙여서 작성했는데 통과되지 않아 보니 이번 과제에서는 Test를 앞에 붙여야 했다.
4.테스트 메서드에서는 Test.startTest() 및 Test.stopTest()를 사용해 테스트를 진행할 수 있고
해당 결과를 Database.SaveResult 등의 타입으로 설정된 결과 값에 저장한 다음
해당 결과값(result)의 isSuccess, getErrors 등의 메서드로 작업 수행 결과를 체크할 수 있다.
5.Apex 트리거 테스트 통과 코드
@isTest
public class TestRestrictContactByName {
@isTest static void Test() {
Contact acct = new Contact(LastName = 'INVALIDNAME');
Test.startTest();
insert acct;
Database.SaveResult result = Database.insert(acct, false);
Test.stopTest();
System.assert(!result.isSuccess());
System.assert(result.getErrors().size() > 0);
System.assertEquals('The Last Name \"INVALIDNAME\" is not allowed for DML',
result.getErrors()[0].getMessage());
}
}
//1.name 부분부터 막혀서 당황했는데 자세히 보니 수정 불가능한 내용이라고 할당을 할 수 없었다.
//Object Manager에 들어갔지만 따로 설정하는 부분을 찾을 수 없었기 때문에 테스트 할 트리거를 자세히 보니
//LastName을 수정해야 한다고 했지만 해당 필드는 존재하지 않았다.
//결론적으로 언급도 하지 않은 LastName field를 직접 생성하니 오류가 사라졌다.
//2.Database.DeleteResult를 Insert로 수정하고 진행해도 되지 않아 검색해도 제대로 나오지 않았다.
//결국 찾은 것은 SaveResult인데 한번 알면 별것 아니지만 메서드명에서 많이 막히는 것 같다.
//3.테스트는 통과할 수 있었지만 마지막 에러 처리가 되지 않았는데 The Last Name 어쩌고로 끝나는 것이 아니라
//추가적으로 이상한 글자가 더 포함된 것 같았다.
//4.글 작성 시 확인하니 INVALIDNAME 부분이 이상하게 보이는데 여러가지 방법으로 시도하다가
//최종적으로 저 부분에서 포기한 내용이다.
6.TestDataFactory는 @isTest 환경에서만 작동하는 유형의 클래스로
테스트 데이터 설정과 같은 유용한 작업을 수행하기 위해
테스트 메서드에서 호출할 수 있는 메서드가 포함되어있다.
7.Apex 테스트용 데이터 생성 통과 코드
public class RandomContactFactory {
public Static List<Contact> generateRandomContacts(Integer contactAmount, String lastNameStr){
Contact[] contacts = new List<Contact>();
for(Integer i=0;i<contactAmount;i++) {
Contact a = new Contact(FirstName = lastNameStr + i);
contacts.add(a);
}
system.debug(contacts);
return contacts;
}
}
//1.공개 클래스 이름 복붙(test 안붙임)
//2.공개 정적 List<Contact> 이름 복붙(test 안붙임)
//3.매개변수 (정수형 갯수, 문자형 성)
//4.반환 List <Contact>
//
//에러 이유
//1.method does not exist(아님)
//2.is not static(아님)
//3.did not return the correct set of Contact records (모름)
//
//해결 => FirstName이라는 필드가 존재했지만 객체 관리자에는 표기되지 않아
//직접 생성해서 시도하다가 에러가 발생했고
//해당 필드의 존재 여부를 정확히 알기 위해서는 공식문서를 봐야한다.
8.Lightning 앱 빌더에서 Visualforce 페이지를 사용할 수 있도록 하려면
"Lightning Experience, Lightning 커뮤니티 및 모바일 앱에 사용 가능"을 활성화해야한다.
9.개발을 진행하기 전 환경 세팅을 해야 하는데
기본 개발 환경, 검토 환경으로 분리될 수 있고
검토 환경은 개발 환경과 다른 브라우저 및 모바일/태블릿 기기 등의 환경이 포함된다.
일반적으로 주 개발 환경은 크롬으로 개발을 진행하게 되며
인터페이스 확인은 Salesforce Classic으로 진행하고
Lightning Exprience 검토 환경에서는 타 브라우저들을 테스트 사용자로 접속해
Lightning Experience 작동을 테스트해볼 수 있다.
모바일 환경은 일반적으로 Salesforce 앱의 디자인 및 동작을 확인하기 위해 세팅하며
앱을 사용할 수 있는 Android, iOS, 태블릿 등으로 진행한다.
초기 세팅이 번거로울 수 있지만 실제로 사용되기 전에는 반드시 점검을 진행해야 하고
특정 환경에서만 되는 것과 특정 환경에서만 발생하는 에러 등을 독립적으로 테스트하기 위해서
각각 다른 지원 장치, 운영체제, 앱 및 브라우저 등을 테스트해야하며
추가적으로 서로 다른 사용자 인터페이스도 확인해야 한다.
(버전마다 확인해야 할 수 있지만 대부분 최신 버전만 확인해도 통과한다)
10.Visualforce를 Lightning Experience에서 시작할 경우 몇가지 특징이있다.
- Visualforce 페이지가 Lightning Experience에서 실행되면 HTML iframe 내부에 생성
- Lightning Experience는 상위 컨텍스트이고 Visualforce 페이지는 하위 컨텍스트가 된다.
- Visualforce 페이지를 Lightning Experience 앱 내의 iframe에 포함시켜 보안에 영향을 준다.
- 세션 유지 및 갱신
- 인증
- 교차 도메인 요청
- 임베딩 제한
- Visualforce 페이지를 Lightning Experience 앱 내의 iframe에 포함시켜 범위에 영향을 준다.
- DOM 액세스 및 수정
- JavaScript 범위, 가시성 및 액세스
- window.location과 같은 JavaScript 전역 변수
- Lightning Experience의 Visualforce 기본값 및 환경 변경 사항
- Salesforce Classic 헤더 및 탐색 메뉴를 숨길 수 없음
- 머리글 및 사이드바가 항상 표시되지 않음
- apex:relatedList 및 차단된 관련 목록 확인하기
- iframe 피하기
- window.location 사용하지 않기
- sforce.one은 Salesforce 모바일 전용이 아님
(1).백준 5585번 거스름돈은 1000원짜리 지폐를 가지고 있을 때
특정 금액의 물건을 살 경우 500, 100, 50, 10, 5, 1원짜리 지폐를 최소 몇장 거슬러 받을 수 있는지 묻는 문제였다.
최소 1원 이상의 물건을 구매해야 하기 때문에 첫 번째 500이상일 경우 500을 감소시켰고
그 외에는 몇개가 될지 모르기 때문에 Math.floor와 %를 사용해 처리했다.
조금 더 이쁘게 배열안에 금액권을 담아서 for문으로 돌린다던가 방법이 있을 것 같지만
정말로 요즘 시간이 없어서 한 문제씩 겨우 풀고 있다.
const input = 1
let money = 1000 - input
let count = 0
if(money >= 500){
money -= 500
count++
}
if(money >= 100){
count += Math.floor(money/100)
money = money % 100
}
if(money >= 50){
count += Math.floor(money/50)
money = money % 50
}
if(money >= 10){
count += Math.floor(money/10)
money = money % 10
}
if(money >= 5){
count += Math.floor(money/5)
money = money % 5
}
count += money
console.log(count)'회고' 카테고리의 다른 글
| [수습일지] - 19 (0) | 2023.04.14 |
|---|---|
| [수습일지] - 18 (0) | 2023.04.13 |
| [수습일지] - 16 (0) | 2023.04.11 |
| [수습일지] - 15 (0) | 2023.04.10 |
| [수습일지] - 14(주말) (0) | 2023.04.09 |
