성능 테스트 기법 (2) Customize Session Handling

Updated:

이번 글에서는, 성능 테스트 Script를 작성하고 나서 정상 작동 여부를 확인하기 위해 Script를 다시 실행했을 때, Error가 발생하여 Transaction Fail이 발생하는 상황에 대해 다루고자 합니다.

특히, ‘Session ID’ 값과 같이 매 수행시마다 동적으로 변화하는 값들 때문에 Error가 발생하는 경우가 많은데, Script에서는 어떠한 방법으로 이러한 값들을 컨트롤하여 정상 동작이 가능하도록 수정하는지, 그 방법에 대해 자세히 살펴보도록 하겠습니다.

1. 성능 Script 작성 준비

성능 테스트 수행을 위해 Project에 들어가게 되면, 담당자를 통해 Script 작성 관련 정보들을 전달받게 됩니다. 즉, 대상 시스템의 URL, 로그인 ID와 Password, 대상 업무 네비게이션(ex. 로그인 > 메인화면 > 통합 조회), 조회 조건(ex. 기간, 검색어 등) 등을 전달 받게 되는데, 요구사항에 대한 확인이 완료되면 이제 시스템에 접속해서 Script를 작성해 볼 수 있습니다.

여기서는, Script Error가 나는 작성 환경을 재현하기 위해, Silk Performer에서 제공하는 Test Sites(http://demo.borland.com/)를 활용하여 직접 Script를 작성해보는 과정을 진행해 보도록 하겠습니다.

MicroFocus

2. Script 작성

Micro Foucs에서 Script 연습을 위해 제공하고 있는 여러 Test Sites 중, 이번에는 Shop It!(http://demo.borland.com/ShopItV60/default.asp)이라는 쇼핑몰 사이트에 접속해서 Script 작성을 해보겠습니다.

MicroFocus

1) Silk Performer 실행

Silk Performer Workbench를 실행하여 ‘Model Script’를 클릭하고, 대상 URL(http://demo.borland.com/ShopItV60/default.asp)을 기입한 후 Recording을 시작합니다.

MicroFocus

2) “Shop It!” 시스템 대상 Script 작성 순서

Shop IT! 페이지가 열리면, 화면 하단의 “Join the experience!” 를 클릭합니다.

MicroFocus

Name 입력 필드에 이름을 기입하고, 하단의 “Enter”를 클릭합니다.

MicroFocus

메인 메뉴 화면에서, 3개 메뉴들 중 “Products”를 클릭합니다.

MicroFocus

Products 화면에서, Camping Equipment의 “Boots1”을 클릭합니다.

MicroFocus

Products - Details 화면에서, 우측에 Order now라고 표기된 위치의 “Add to basket”을 클릭하여 부츠를 장바구니에 담습니다.

MicroFocus

하단의 “Back to main menu”를 클릭하여 Main Menu로 돌아갑니다.

MicroFocus

선택한 물품을 구입하기 위해, “Check Out”을 클릭합니다.

MicroFocus

물품이 정상적으로 담긴 것을 확인한 후, “Continue”를 클릭합니다.

MicroFocus

주소와 카드정보를 기입한 후 “Buy Now”를 클릭합니다.

MicroFocus

기입된 정보가 정확한 지 확인한 후, “Proceed”를 클릭합니다.

MicroFocus

주문이 완료되었음을 보여주는 “Thank you”화면까지 나타나면, Script를 종료하고 저장합니다.

MicroFocus

3) Script 생성

Script Recording이 완료되면 나타나는 Capture File 페이지에서, Domain Filter Setting 부분에서 “Include only traffic from domains selected bellow”를 선택하고, 하단에, “demo.boland.com”이 체크되어 있는 것을 확인한 후, 우측 상단의 “Generate Script”를 클릭하여 Script를 생성합니다.

MicroFocus

아래와 같이 기본 Script가 작성되어 나타나면, Script Error가 없는지 점검을 수행하기 위한 다음 단계로 넘어갑니다.

MicroFocus

3. Script 점검

1) Try Script

Silk Performer Workbench 상단의 Workflow Bar에서 “Try Scrip”를 클릭한 후, 나타나는 팝업 우측 하단의 “Run” 버튼을 클릭하여 저장된 Script를 실행합니다. 이때, 1명의 가상사용자(Vuser)를 대상으로 Script가 실행되는데, 이를 통해 Script의 정상작동 여부 및 Error 현황을 확인할 수 있습니다.

MicroFocus

2) Try Script Summary

실행이 완료되면, Silk Performer Workbench 화면에는 결과 요약 및 Error 내역이 나타납니다. 아래 화면에서 보여지는 것과 같이, Script 수행의 결과로 3개의 Error와 1개의 Failed Transaction이 발생한 것을 확인할 수 있습니다.

MicroFocus

3) Silk TrueLog Explorer

한편, Try Script를 수행할 때, 동시에 Silk TrueLog Explorer가 실행되는데, 여기서는 Script가 구동될 때 실제로 렌더링되는 화면들을 순차적으로 캡쳐해서 그 결과로서 보여줍니다. 왼쪽의 트리 리스트를 위에서부터 하나씩 클릭해보면, Script 작성시에 클릭했던 각각의 페이지들이 Try Script의 결과로서도 동일하게 나타나고 있는지, 오른쪽 화면을 통해 쉽게 확인할 수 있습니다.

MicroFocus

한편, 우리가 Silk Performer Workbench에서 확인했던 Error들은, 구체적으로 Silk TrueLog Explorer 화면 왼쪽의 트리 리스트에서 해당 부분이 빨갛게 X표시되어 있는 것을 확인하실 수 있습니다. 이를 클릭해 보면 정상 페이지가 나타나지 않고, “The page can not be displayed due to a gateway timeout”이라는 메시지를 보여주고 있음을 알 수 있습니다.

MicroFocus

4. 원인 파악 및 문제해결

위와 같은 Error 현상은, 최초 Script 작성시에는 Session ID가 고정값으로 저장되었지만, Script 재수행 시에는 저장된 Session ID가 더이상 시스템상에서 유효하지 않기 때문에 발생합니다. 이러한 문제를 해결하기 위해, Silk Performer에서는 “Customize Session Handling” 기능을 활용할 수 있습니다.

1) Customize Session Handling

Silk TrueLog Explorer 왼쪽 상단의 “Customize Session Handling” 메뉴를 클릭하면 아래와 같이 팝업이 나타납니다. 팝업 화면에는 두개의 버튼이 있는데, 이들 중 위의(“Differences between~”으로 시작되는) 버튼을 클릭하면, 기록된 Session값과 실행시 값을 비교하여 차이나는 부분을 알려주는 기능을 활용할 수 있습니다.

MicroFocus

다음 화면으로 넘어가기 전, 비교 대상으로서 기록된 로그(Record TrueLog)를 불러올 것인지를 물어보는 팝업창이 뜨는데, “예”를 클릭합니다.

MicroFocus

2) Keep TrueLog Syncronized

이제, 기록된 Script 결과값과 재실행된 Script 결과값의 차이를 보여주는 비교모드(compare mode) 화면이 나타나는데, 동기화가 유지되어 차이를 식별할 수 있도록, 좌측 상단의 “Keep TrueLog Syncronized” 버튼을 클릭합니다.

MicroFocus

3) Step Through TrueLog

“Step Through TrueLog” 팝업 화면에서, 비교 대상은 “Whole Pages”로 선택하고 “Find Next” 버튼을 한번씩 누르면서 왼쪽 트리 리스트의 맨 위부터 하나씩 순차적으로 확인해 나갑니다.

MicroFocus

계속 누르다 보면, 처음에는 두 로그 간에 차이가 없다는 메시지(“No differences were found…“)만 나오다가, 어느 지점에 다다르면 ‘차이점을 찾았다’라는 메시지(“Differences found in…“)가 아래와 같이 나타나는 것을 보실 수 있습니다.

MicroFocus

메시지 하단의 제공 정보를 잠시 살펴보면, 두 로그간의 ID값을 비교하여 보여주고, 추가적인 정보들(ex. Session ID가 HTML 페이지에서는 1번, BDL Script에서는 총 3번 나타남, Session ID 후보임(Candidate: Yes))을 제공하고 있는 것을 확인하실 수 있습니다.

4) Insert Parsing Function

로그의 값을 자세히 들여다보면, 재실행된 로그(Replay TruLog)의 Session ID값과 기록된 로그(Record TrueLog)의 ID값이 다름을 알 수 있습니다. 이제, Script에 하드코딩된 정적 Session ID값이 동적인 값이 될 수 있도록, 해당 숫자 부분을 변수처리하기 위해 마우스로 더블 클릭하면, “Insert Parsing Function” 팝업이 뜨게 됩니다.

팝업창에서 적절한 변수명(Variable Name)을 기입하고, 동일한 Session ID값이 한번에 모두 변경될 수 있도록 “Parse & Replace 부분에 체크(Found 3 occurences in script: Replace with variable)되어 있는 것을 확인한 다음, “OK” 버튼을 클릭합니다.

MicroFocus

5) Script 확인

Silk Performer Workbench로 다시 돌아와서, Script를 확인해 보면, Session ID값 관련 기존 “sid”의 숫자값 부분이 sFormSid1, sFormSid2, sFormSid3의 3개로 각각 변수처리되어 반영되어 있는 것을 보실 수 있습니다.


@codepage(949)

benchmark SilkPerformerRecorder

use "WebAPI.bdh"

dclparam
  sSessionInfo1     : string;

dcluser
  user
    VUser
  transactions
    TInit           : begin;
    TMain           : 1;

var
  sFormSid1         : string;
  sFormSid2         : string;
  sFormSid3         : string;

dclrand

dcltrans
  transaction TInit
  begin
    WebSetBrowser(WEB_BROWSER_MSIE11);
    WebModifyHttpHeader("Accept-Language", "ko-KR");
    //WebSetUserBehavior(WEB_USERBEHAVIOR_FIRST_TIME);
    //WebSetDocumentCache(true, WEB_CACHE_CHECK_SESSION);
    WebSetDomainSuppress("demo.borland.com", true);
  end TInit;

  transaction TMain
  var
  begin
    WebCookieSet("Visitor=Sungryong; domain=.borland.com; path=/ShopItV60; expires=Sat, 08 Feb 2031 05:55:26 GMT", 
      "http://demo.borland.com/ShopItV60/default.asp");
    WebCookieSet(
      "ASPSESSIONIDQABTQCTC=MBIGAGMDFGIJFHLOALNEKPKA; domain=.borland.com; path=/ShopItV60; expires=Sat, 08 Feb 2031 05:55:26 G"
      "MT", "http://demo.borland.com/ShopItV60/default.asp");
    WebPageUrl("http://demo.borland.com/ShopItV60/default.asp", "ShopIt - Greetings");
 
    WebPageLink("Join the experience!", "ShopIt - Confirm your name"); // Link 1
 
    WebPageSubmit("Confirm", CONFIRM001, "ShopIt - Main menu"); // Form 1
 
    WebPageLink("Products", "ShopIt - Product"); // Link 2
 
    WebPageUrl("http://demo.borland.com/ShopItV60/checkselection.asp", "ShopIt - Product (#1)", SHOPITV60_CHECKSELECTION_ASP002)
      ;
 
    WebPageLink("Add to basket", "ShopIt - Basket"); // Link 1
 
    WebPageLink("Back to main menu", "ShopIt - Main menu (#1)"); // Link 1
 
    WebParseDataBoundEx(sSessionInfo1, STRING_COMPLETE, "name=\"", 3, "\"", WEB_FLAG_IGNORE_WHITE_SPACE | WEB_FLAG_CASE_SENSITIVE,
      1);
    WebPageLink("Check out", "ShopIt - Check Out"); // Link 3
    Print("sSessionInfo1: " + sSessionInfo1);
 
    sFormSid1 := sSessionInfo1;
    WebPageUrl("http://demo.borland.com/ShopItV60/kindofpayment.asp", "kindofpayment.asp", SHOPITV60_KINDOFPAYMENT_ASP003);
 
    sFormSid2 := sSessionInfo1;
    WebPageUrl("http://demo.borland.com/ShopItV60/card.asp", "ShopIt - Pay with credit card", SHOPITV60_CARD_ASP004);
 
    sFormSid3 := sSessionInfo1;
    WebPageForm("http://demo.borland.com/ShopItV60/acknowledge.asp", SHOPITV60_ACKNOWLEDGE_ASP005, "ShopIt - Acknowledge");
 
    WebPageLink("Proceed", "ShopIt - Thanks"); // Link 1
  end TMain;

dclform
  CONFIRM001:
    "Confirm-Button"            := "" <USE_HTML_VAL> ; // unchanged, value: "Confirm"

  SHOPITV60_CHECKSELECTION_ASP002:
    "product"                   := "boots1";

  SHOPITV60_KINDOFPAYMENT_ASP003:
    "choice"                    := "CreditCard",
    "price"                     := "59.9",
//     "sid"                       := "1012956735";
    "sid"                       := sFormSid1;

  SHOPITV60_CARD_ASP004:
//     "sid"                       := "1012956735";
    "sid"                       := sFormSid2;

  SHOPITV60_ACKNOWLEDGE_ASP005:
    "address"                   := "1004",
    "city"                      := "Sungnam",
    "state"                     := "Gyunggi",
    "ZipCode"                   := "12345",
    "cardtype"                  := "Visa",
    "cardnumber"                := "1234123412341234",
    "expiration"                := "11/29",
//     "sid"                       := "1012956735";
    "sid"                       := sFormSid3;

6) Try Script 실행 및 결과 확인

이제 수정된 Script가 정상적으로 작동하는지 확인하기 위해, 다시한번 “Try Script”를 실행합니다. Script 수행이 완료된 후 Try Script Summary 화면에서 결과를 확인해 보면, 이번에는 Error나 Failed Transaction이 더이상 나타나지 않고, 2개의 Successful transaction만 ‘정상 결과’로서 보여주고 있는 것을 확인하실 수 있습니다.

MicroFocus

7) Silk TrueLog Explorer 실행 및 결과 확인

Silk TrueLog Explorer 화면으로 이동해서, 모든 결과가 처음과 같은 빨간 X표시 없이 정상 처리되었는지 확인해 봅니다. 트리 리스트를 순차적으로 클릭해보면, 이번에는 우리가 Script 작성시 ‘주문 완료’ 단계에서 보았던 “Thank you ~” 화면이, 아래와 같이 ‘정상수행’ 결과로서 나타나고 있음을 확인할 수 있습니다.

MicroFocus

5. 마무리 글

지금까지, Script 작성 시 자주 접하게 되는 Session ID 관련 Error 상황에 대해 실제로 재현해 보고, 그 원인 발생위치를 확인하는 방법과, 동적으로 변화하는 값의 문제를 해결하는 방법에 대해 살펴보았습니다.

성능 테스트 수행에 있어서는 Script가 반복 수행 가능해야만, 실제 부하 발생 및 지속이 가능합니다. 상용 성능테스트 자동화 도구에서는, 이러한 부분에 대한 파악과 수정 작업이 모두 매끄럽게 자동화되어 지원될 수 있도록, 기능들이 점차 업데이트되고 있습니다.

예를 들어, LoadRunner의 경우에는 동적으로 변화하는 값을 Script에서 변수처리하는 작업을 ‘Correlation’이라고 하는데, 기존에는 ‘web_reg_save_param’ Function등을 이용해 수작업으로 Script를 수정하는 작업을 수행하였습니다. 하지만, 최근 버전부터는 Script 작성 완료 시 Automatic Correlation을 지원하는 ‘Design Studio’ 기능이 추가되었습니다.

이 기능은, Script상에 존재하는 Dynamic Value들을 빠르게 Scan하여 수정이 필요한 부분들을 바로 알려줍니다. 또한, Scan 결과 화면에서 수정 대상 선택 후 ‘Correlate’ 버튼만 클릭하면, 바로 Script 수정 작업 반영까지 완료해 줍니다.

예를 들어, LoadRunner로 “Shop It!” 사이트 대상 Script를 작성한 후, Design Studio를 실행해 보면, 아래 화면과 같이 우리가 변수 처리해야 할 ‘sid’ 3건에 대해 바로 파악해서 보여주는 것을 알 수 있습니다. 또한, 동일 화면에서 왼쪽 상단의 ‘Correlate’ 버튼을 누르는 것 만으로 손쉽게 Script 수정 반영까지 가능하도록, 편리한 화면 구성을 제공하고 있습니다.

MicroFocus

시간이 갈수록, 상용 성능 테스트 도구에서 Script 준비에 많은 시간을 소모하던 ‘수작업’들은 점차 자동화되어 가는 추세이므로, 향후에는 Project 실무자가 성능 테스트 수행 및 결과 분석에만 집중할 수 있는 환경으로 변화하게 될 것이라고 생각합니다.

Global 기술 동향을 살펴보면, 성능 테스트 도구에도 향후 AI가 결합되어 Script 작업이 극도로 단순화된다고는 이야기 하지만, 아직은 그런 시기가 도래하지 않은 관계로, 그동안 배운 Script 작성 기법과 관련 개념들을 공유하는 글을 계속 이어서 써 보도록 하겠습니다. ^^

[끝]