Skip to Content

Performance Testing in BI 4.1

I’ve recently spent a bunch of time getting to know BI 4.1, and part of that process is taking it for the proverbial test drive in terms of performance.  To do this, I always use Apache JMeter since it is free and a great overall product.  I’ve been documenting the process for designing performance and regression tests on BI 4.0 on the SCN Wiki for some time, but with the popularity of this topic, along with the added exposure gained in my recent ASUG webcast on automated regression testing, I haven’t made it as far as I would like in the process.

Due to challenges and other commitments, I just got around to creating a test plan for BI 4.1.  The test plan invokes 3 different BI clients … Web Intelligence, Explorer, and Analysis for OLAP, and all get backend data from HANA.  I’ve uploaded the JMX code for this test plan on the wiki:

And this represents a new process for me that should be sustainable in the long-term.  It was taking such a time commitment to exhaustively document every step in test plan creation that I found myself with dozens of functional test plans, but only a few of which were documented for use.  Therefore, I propose to put all of my test plans on the wiki as source code.  You can simply copy and paste the code into a file that you save with a .jmx extension, and then you’ll be able to open it directly in JMeter.  I will use this space as a means to blog about the test plans, and explain the key components you’ll need to customize to use them in your own environment.  I’ll look forward to your feedback on whether or not this process works and can fine tune as necessary.

You can familiarize yourself with JMeter and create your first test plan (exhaustively documented) here:

BI 4.1 Mixed Test Plan

First, in order to open this test plan, which uses JMeter plugins to instrument system resources such as CPU and Memory, you must follow the instructions found here:

Once you have added these plugins to the JMeter lib/ext directory you can open the test plan and see this goodness!

41 Mixed Test Plan.png

The test plan is broken down as follows:

1. Thread Group configured (by default) for 100 users and a 300 second (5 minute) ramp-up time.  This means that after 5 minutes, 100 users will actively be performing BI workflows on your server.

2. Each user logs on to the environment, as controlled by the requests in the Logon transaction controller.

3. Each user opens and refreshes a Web Intelligence report.

4. Each user opens a previously saved Exploration View Set.

5. Each user creates a new Analysis Workspace, selecting a connection, adding a dimension, and inserting a chart.

6. Each user logs off of the system.

Unique users are leveraged for each thread and that process is configured in the BI Users CSV config.  At the end of each transaction controller is a Uniform Random Timer that causes a delay between 100 ms and 2000 ms (2 seconds) between each request.  This emulates a business user performing some analysis and keeps the requests from flooding the system.  The timer duration is not included in the results so we get a pure view of how long each operation takes.

Breaking it Down

I cover the Logon/Logoff methods in the wiki page I provided above, but logging onto BI 4.1 requires one slight alteration from BI 4.0.

BI 4.1 uses a Java Server Face to process the BI Platform logon so it is necessary to pass a parameter called com.sun.faces.VIEW to the logon.faces request.  I struggled with this initially and discovered that if you don’t pass the value the logon page simply gets re-postedand you never get a session!

Here is what the regular expression extractor should look like:

41 JSF Logon.png

We need to pass this value into the following logon.faces request:

41 JSF Logon 2.png

From here I will just talk about the individual BI clients.  Web Intelligence gets to go first by virtue of its position in the test plan:

Web Intelligence

Regular expression extractors are attached to 3 samplers in the Web Intelligence workflow.  The values extracted are:

1. The SI_ID of the user’s Favorites Folder

2. The sEntry representing the Webi document state when the report is first opened.

3. A second sEntry value representing the Webi document state when the report is refreshed.

Once those values are extracted they should be attached to the appropriate Webi samplers as JMeter variables.  JMeter variables take the form ${fav}, ${sEntry}, etc.

Since JMeter test plans are plain text it is easy to replace static strings such as an sEntry (sEntry might take the format we0001000078432c722f78)

Refer to this new SCN Document for details on how to do the text replacement!

The result of the Web Intelligence workflow looks like this:


In the interest of length of this article, I’ll wrap up this post for now and follow up with another post next week to articulate the Explorer and Analysis OLAP workflows.  I’m really excited to be performance testing with BI 4.1 … my initial tests show it performs really well and I’ll look forward to sharing more of these details with you.

You must be Logged on to comment or reply to a post.
  • This work that you and Henry and Toby and others are doing is empowering Administrators and Consultants like never before. We are all thankful for that.

    I am creating my own plan here, and even after capturing the com.sun.faces.VIEW value (I can see the variable value in the Debug Sampler result), the extractor for the bttoken continues to fail (the bttoken value always returns the default value).

    I'm running it against BI 4.1, and capturing the VIEW value at the first occurrence of .../logon.faces and the BTTOKEN value after the second appearance of .../logon.faces.

    Please let me know if you have any pointers/suggestions.

    *** EDIT: solved ***

    This is what I was doing wrong:

    In BI4.0, the BTTOKEN post-processing extractor regular expression is:


    In BI 4.1, one needs to use this expression instead:


    I will leave this comment in case anyone has the same issue.



  • James, it's a great job you're doing here. Thanks a lot.

    I was wondering if JMeter could be used for testing mobile access performance.

    Will for example an IPAD emulator be recognised  by the http proxy?

    Do you plan to make & share such tests?

    Other question, in my test plan i would like to simulate webi document creation with the applet. Will there be specific parameters to catch in that case?

    thanks again

    Xavier Bry

    • Hi Xavier,

      Thanks for the comment and the positive feedback.

      You ask some very relevant questions so let me try to answer them as best I can:

      1. Regarding mobile access performance, I would like to capture this in the near future as mobile performance is paramount to adoption on device.  The HTTP proxy component will only capture data that is sent through it, so it may be possible to capture an iPad emulator as long as it first passes through an active proxy.  Another thought I had was to enable HTTP access logging on my Tomcat server, and to capture the requests in that fashion to construct a corresponding test plan from the HTTP requests.  I would be very interested to hear about your experience regarding the emulator.
      2. JMeter supports java samplers as well, so it would be technically possible to create a test plan that emulates report creation through the applet.  However, these methods would not be captured via the HTTP proxy since they are not HTTP calls.  This would be further complicated by the fact that you would need to add the entire JRP/Rich Internet Application to the JMeter classpath and call the methods individually.

        Furthermore, JMeter is not a browser/client itself, so client performance of the JRP would not truly be emulated, and I suspect that server impact of using one report creation tool vs. another (say DHTML or RESTful Web Service) is minimal.  My suggestion would be to create test plans that simulate report creation using either the DHTML client or the new (4.1 SP2) RESTful Web Service API.  I would be happy to consider both of those use cases for future test plan creation.



  • A very interesting manner of testing the business environment. It definitely helps / ideas for everyone to perform their own individual testing activties.

  • Dear James,

    Both the articles (BI4 & BI4.1 webi) on performance testing are Outstanding and leaves no doubt for the developer/tester.!!! I was able to execute the BI4.1 Webi performance testing through JMeter successfully.

    But recently I have been struggling with the Performance testing (using JMeter) of a BO4.1 webi report having prompts in a report query. In the debug sampler bttoken, sEntry are correctly populated but sEntry2 is populated as NONE.

    Do we need to add a Regular Expression Extractor for prompt also? Can you please provide help on this.



    • Hi Pankaj,

      Thanks for the feedback.

      Yes the trick with prompts is that they have a bit of dynamic data you have to extract as well.  I recommend using Fiddler/HTTPWatch to capture you performing the same steps you used in your JMeter test plan.  You can then examine the dynamic methods and look for the parameter you need to extract.  Feel free to post your findings here and we can look together.



      • Hi James,

        Thanks once again and appreciate your quick reply. Initially I wasn't using fiddler but after you suggested I was able to trace the dynamic parameter for prompts with the help of fiddler. The test was successful for the report with prompts !!

        The findings are:

        1) I have removed Regular Expression Extractor from refreshDocument.jsp

        2) And the Regular Expression Extractor is added for processPrompts.jsp (***sEntry2 Extractor**).

        One thing strange I noticed is that, the viewer/report.jsp  returns only data in the report tables, and graphs are not displayed in JMeter. Is that JMeter don't return/display graphs?

        Can you please share your thoughts on this.

        Also, can we prepare and run a test for Xcelsius dashboards? If possible can you shed a light on this briefly.

        Thanks & Regards,


        • Pankaj,

          Charts are returned by a different URL.  I cover the use of getImage.jsp in BI4 Web Intelligence Performance Test with JMeter

          Please refer to that document for steps on retrieving images from Web Intelligence documents.

          As for Dashboards (Xcelsius), I have done some work there but haven't had an opportunity to document it exhaustively as with these others.  I will load a JMeter test plan to the Wiki this week that you can look at to get you started though.



          • Thanks for the reply James.

            Actually I am still stuck at the graph part (pie-chart, column chart) in the report.

            After running the JMeter test plan, none of the viewer/getImage.jsp page is returning/displaying the graphs present in the report.

            But when the mode in View Results Tree is changed from HTML to HTML (download resources), apart from the table data, viewer/viewReport.jsp displays the text like Pie Chart, Column Chart with a symbol of image. I have attached a screen shot for your reference.

            I am unable to trace where its going wrong.JMeter Test Plan.png

            JMeter Test Plan.png
          • Hi Pankaj,

            This is expected behavior.  The images should actually be attached to the response body of the getImage.jsp methods.  When you enable HTML (downloaded resources) it instructs JMeter to follow embedded links to retrieve resources included in the HTML.  You can enable/disable this setting on your request samplers as well if desired.


        • Hi James/Pankaj,

          Please let me know if we need to repeat the workflow in IE to extratct sEntry for processprompts.jsp

          I did the same and got the sEntry value however I am not sure if this value can be used in my existing test plan in Jmeter as that was created based on a previous workflow.

          @James: Thanks for this wonderful article!

          I have crated a test plan on my client machine on JMeter 2.7 however I do not see jp@gc - PerfMon Metrics Collector in the list. Is there any addon I need to install.

          Also do I need to mention my BO CMS server name and ports to capture the performance on the server from client.



          • Hi Anshul,

            It is necessary to extract a new sEntry every time the Web Intelligence document state changes.  For example, open a webi doc (sEntry 1), refresh a webi doc (sEntry 2), drill in a webi doc (sEntry 3), etc.  When processing prompts it will also be necessary to pass a distinct sEntry.  Use a product like Fiddler to identify just what the functional dynamic data should look like.

            As for JMeter resources, use this resource to find and configure them:

            Integration of Server Resource Monitoring with JMeter Plugins



  • Hi James,

    I am trying to run your script to refresh Webi report but get error when executing /BOE/portal/1408041430/InfoViewAppActions/ajaxUre/ajaxRequest and in the sample result it says response code is 403 and in Response data : boetrustguard.TokenCreationFailedMessag

    We are running BO 4.1, split deployment (apache + Tomcat) in Windows 2008 environment.

    SSO is configured but I am using http://servername/BOE/BI/logonNoSso.jsp to capture the logon details.

    Looking forward for your early response.



  • Hi James, I am following you article about performance testing in 4.1 and thought of giving it a try. I have setup JMeter as you suggested and setup HTTP Proxy (using Jmeter 2.12). when I recorded the script it seems like it's getting all the information but when I rerun tests, it's failing on couple of places and after further research, it's bttoken value that's not is not passing this value at all (no matter what regular expression I tried) I made sure i'm using (.+?)" but to no use. I still see bttoken=None (default value). is there any thing in the regular expression I'm missing


    I don't see any bttoken value in the response data from (login URL) as well..

    any help you can provide would be great.



    • Hi Kenny,

      It depends on which version of the product you're trying to run the performance test against. Your best bet is to use the View Results Tree in conjunction with a Debug Listener to test the regular expression. You can do this by changing the view to Regular Expression Tester and looking for the appropriate string.



      • Thanks James. Appreciate your reply. I am using BO 4.1 SP4. when I login initially without running test case, I can see bttoken in my response data but when I run test case, the same response data is coming in with blank bttoken. I tried using Fiddler and it shows bttoken value, but JMeter , for some reason not registering it as a test case. hope I'm making sense..any ideas ??

        • Hey Kenny,

          Take a look at this comment:

          It looks like you're using the appropriate syntax, but it must be attached to the wrong request. You need to check the results of View Results Tree to see what the response body of your logon requests are. Is there a bttoken value returned as part of the response body? If not, you've either missed extracting the com.sun.faces value or there will be an exception there.

          • Thanks for your reply again.

            1) I am using appropriate syntax (I hope)

            2) I think I have attached this to correct request ( url ) as that's where I see bttoken value .. there is not bttoken value in prior requests

            3) I have setup com.sun.faces.VIEW value and it is dynamically picking up correct values (using ${com} variable. that works perfectly

            Still,I don't see bttoken value in response body.

            What else could be missing? also, you said there might be an exception , could you elaborate on that if you don't mind?

            Once again, thanks for taking time and helping me out



          • Kenny,

            You need to extract bttoken from the logon.faces request:



            <script type="text/javascript">

            window.location = "../InfoView/listing/";




            The regex you have above should work for this. Make sure you're passing ${bttoken} to the following request

          • James, thanks for your reply and sorry for responding late. Looks like my logon.faces is completely different from your logon.faces (i'm using 4.1 SP4) the script you specified in your reply is in my url response and it's bttoken=&None (coming form my regular expression extractor,added in logon.faces in previous URL sample)

            So, do I have to put extractor in and extract bttoken value? I tried that as well but did not work..

            Thanks for any suggestions you can provide

          • Kenny,

            I pasted mine from 4.1 SP4. Can you just email me ( the contents of your View Results Tree? I need to see the response body of every request preceding the The bttoken extraction must be performed before you hit



          • Hi James,

            I try to follow your steps and found some issue about "bttoken" with SAP BI 4.1 SP6. I found ${bttoken} was NULL. Could you advise me about issue?



  • I followed the steps as mentioned in the document but I am not getting the information  as mentioned in the blog.

    What I am getting is as follows

    I then added the Postprocessor – Regular expression extractor as shown in screenshot below and the logon.faces as shown below.

    • Hi Thomas,

      Unfortunately the screen shots didn't come through. Please add a View Results Tree component and Debug Listener component to detemermine:

      1. which request is failing (it will be red)

      2. whether ${COM} and ${BTTOKEN} are populated/extracted correctly. You can see this detail at the bottom of the View Results Tree component after adding both and running your test.



  • James,

    I need your help to fix this.

    I followed your blogs to create my first test plan as we are planning to use Jmeter for BI 4.1 performance testing,

    I created this using BI 4.1 Sp3 and there is slight variation based on your screenshot.

    I am getting error whenever I execute login controller.


    login 1.PNG


    Any help is very highly appreciated .


    • Hi Raj,

      You'll have to use a debug listener and view results tree components to ensure both variables {$COM} and {$BTTOKEN} are being populated properly. The 500 internal server error suggests some bad data is being passed into the request. Is this environment configured to use SSO?

      • James,

        Thank you so much for the help.

        This System is not configured for SSO.

        Here is the post data for the reqeust



        POST data:


        Cookie Data:


        Request Headers:


        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

        Cache-Control: max-age=0

        User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36


        Connection: keep-alive

        Accept-Encoding: gzip, deflate

        Accept-Language: en-US,en;q=0.8

        Content-Length: 145

        Content-Type: application/x-www-form-urlencoded

        • Check the debug sampler component along with view results tree to determine whether ${COM} is being extracted correctly. In the request above:


          decodes to:


          The syntax is ${COM}, please check your test plan and update accordingly.

          • Hi James,

            I have same issue as Raj (500) and i added debug listener and view results tree.

            and the com.sun.face.view exactly decodes to ${COM}.

            We done have SSO also.Appreciate your inputs on this

            Apologies for adding the code, hoping it would be helpful for others if they encounter same issue

            Additional details as follows

            Sample Start: 2015-03-24 20:35:16 GST

            Load time: 11

            Latency: 10

            Size in bytes: 1423

            Headers size in bytes: 330

            Body size in bytes: 1093

            Sample Count: 1

            Error Count: 1

            Response code: 500

            Response message: Internal Server Error

            Response headers:

            HTTP/1.1 500 Internal Server Error

            Server: Apache-Coyote/1.1

            Set-Cookie: JSESSIONID=8F148429B1C5820B7A06A1C9BC88FA6C; Path=/BOE/; HttpOnly

            X-UA-Compatible: IE=edge,requiresActiveX=true

            Content-Type: text/html;charset=utf-8

            Content-Language: en

            Content-Length: 1093

            Date: Tue, 24 Mar 2015 16:35:16 GMT

            Connection: close

            HTTPSampleResult fields:

            ContentType: text/html;charset=utf-8

            DataEncoding: utf-8

            POST http://bi1-prod:8080/BOE/portal/1412222144/InfoView/logon.faces

            POST data:


            [no cookies]

            Request Headers:

            Accept-Language: en-US

            Content-Length: 124

            Accept-Encoding: gzip, deflate

            Referer: http://agh-bi1-prod:8080/BOE/BI

            User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C)

            Connection: keep-alive

            Content-Type: application/x-www-form-urlencoded

            Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/, application/, application/msword, */*

            Pragma: no-cache

          • Hi Thomas,

            It looks like you're missing cookies from the request. Please add an HTTP Cookie Manager component to the test plan and run it again. The values, ${user}, ${pass}, and ${COM} should enumerate to the correctly extracted values. You can check this using a combination of Debug Sampler and View Results Tree components. The debug data will appear at the very bottom of the View Results Tree component.



  • Hi James,

    I have a requirement to use the Same JMX file in multiple environments and for multiple reports by passing the inputs to the JMX file using Java Programming.

    Suppose, if I have test plan which I created from JMeter for Refreshing the BO Report. Then I have to use the same JMX file in other BO Environments for any reports which client want to test.Like by passing the BO server details and Report details in a excel file as inputs to the JMX file using Java.

    Is it possible to use the same JMX file for other environments and for Other reports?Please advise me on this so that I will take it forward.

    Thank you very much in Advance!!!



  • Thank for detailed guide James!

    I have made several tests according your guide and they did great job in BO testing!

    Now our client ask us to generate load on HANA db through BO report refreshing.

    But when I run BO test that includes report refreshing step there is no load generated on HANA side.

    It means when in HANA I am checking M_ACTIVE_STATEMENTS table during test script execution I cant see script from my BO report.

    I guess ".../refreshDocument.jsp" step in test do not reach HANA somehow.

    Have you ever faced such issue?

    Thank you in advance!