I am using Tsung for load testing. Here is the config file for Tsung.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd" []>
<tsung loglevel="warning">
<clients>
<client host="t1" cpu="2" maxusers="30000000"/>
<client host="t2" cpu="2" maxusers="30000000"/>
</clients>
<servers>
<server host="localhost" port="9200" type="tcp"/>
</servers>
<load>
<arrivalphase phase="1" duration="1" unit="minute">
<users arrivalrate="5" unit="second"/>
</arrivalphase>
</load>
</tsung>
But, I want the following:
Only one user per client everytime
Specific data to be read from file for each user. As in, I want to read data from a user1.json for user1 (on client 1) and from user2.json for user2 (on client2).
Is this possible in Tsung? I went through the docs, but didn't find any option to do so. Can someone help me out with this?
Not exactly what you're asking for. But something similar is possible, with one input file.
<options>
<option name="file_server" id="inputUsers" value="/tmp/users.txt"/>
</options>
<sessions>
<session probability="100" name="test" type="ts_http" >
<setdynvars sourcetype="file" fileid="inputUsers" delimiter=";" order="iter">
<var name="userId"/>
<var name="deviceMac"/>
<var name="tKey"/>
</setdynvars>
<request subst="true">
<http url="/abc/%%_userId%%/%%_deviceMac%%?arg=%%_tKey%%" version="1.1"></http>
</request>
<request subst="true">
<http url="/123/%%_userId%%" version="1.1"></http>
</request>
</session>
</sessions>
Where /tmp/users.txt contains colon separated user specific values - something like this (userId;deviceMac;tKey):
97099;05d4e99de98a;4xrwgyyze54kefnwsd74kj4ghvn5f1
Considering the setdynvars order value is "iter", it will iterate through each line, and use that input data as request parameters.
In the above example case, it would make these two requests:
/abc/97099/05d4e99de98a?arg=4xrwgyyze54kefnwsd74kj4ghvn5f1
/123/97099
You can achieve "user specific" load test scenario this way.
Related
I've set up TSUNG (v1.7) to test my application, but I'm facing some problem using a dynamic variable on my http request. To be more precise I need to retrieve some data from a CSV file and inserting it in my request.
Reading the documentation it seems that I don't really need to write any sort of functions, since I'm using a version above the 1.3, so to achieve that I just need to specify the file path on the 'option' tag and use the 'setdynvars', but unfortunately it doesn't seems works (the web server response says that the content is empty). Any idea why?
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/home/Desktop/tsung-1.7.0/tsung-1.0.dtd">
<tsung loglevel="warning">
<clients>
<client host="localhost" use_controller_vm="true"/>
</clients>
<servers>
<server host="127.0.0.1" port="8000" type="tcp"/>
</servers>
<load>
<arrivalphase phase="1" duration="2" unit="minute">
<users interarrival="45" unit="second"/>
</arrivalphase>
</load>
<options>
<option name="file_server" id="transactions" value="/home/Desktop/transactions.csv"/>
</options>
<sessions>
<session name="dummy" weight="1" type="ts_http">
<setdynvars sourcetype="file" fileid="transactions" delimiter=";" order="iter">
<var name="number_transaction"/>
</setdynvars>
<request>
<http url="...path..." method="GET" version="1.1"></http>
</request>
<request subst="true">
<http url='...path...' version='1.1' contents='transaction_id=%%_number_transaction%%' content_type='application/x-www-fomr-urlencoded' method='POST'></http>
</request>
</session>
</sessions>
</tsung>
After some attempt I've figure out that by simply removing the attribute content_type from the request it will make the whole configuration works!
i am planning to post dynamic files,
<request subst="true">
<http url="/test.php" contents_from_file="file.csv" method="POST"></http>
</request>
is there any option to post dynamic files instead of hard coded one ?
The contents_from_file arg not support dynamic.
please see the ts_config_http.erl file line 58.
You can also refer to this way:
<if var="Args" eq="1">
<request subst="true">
<http url="/test.php" contents_from_file="1.csv" method="POST"></http>
</request>
</if>
<if var="Args" eq="0">
<request subst="true">
<http url="/test.php" contents_from_file="2.csv" method="POST"></http>
</request>
</if>
I use Intuit QBO SDK v3 DataService.FindById to get a Customer entity, modify some of the attributes including PreferredDeliveryMethod then call DataService.Update. When I set PreferredDeliveryMethod to 'Print' or 'Email', the Customer is modified correctly as shown by the response object. When I set PreferredDeliveryMethod to 'None', the response comes back with 'Print' regardless of what it was before I applied the modification. How do I set PreferredDeliveryMethod to 'None' for a proper response?
Update: This issue was with a Sandbox Company. When I tried it with a Production Company, the update worked correctly. There is some suspicion Company settings are involved but I don't know what yet.
Request:
<?xml version="1.0"?>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" domain="QBO" sparse="false" xmlns="http://schema.intuit.com/finance/v3">
<Id>3</Id>
<SyncToken>2</SyncToken>
<MetaData>
<CreateTime>2014-09-19T19:51:22-04:00</CreateTime>
<LastUpdatedTime>2015-02-10T09:53:30-05:00</LastUpdatedTime>
</MetaData>
<GivenName>Grace</GivenName>
<FamilyName>Pariente</FamilyName>
<FullyQualifiedName>Cool Cars</FullyQualifiedName>
<CompanyName>Cool Cars</CompanyName>
<DisplayName>Cool Cars</DisplayName>
<PrintOnCheckName>Cool Cars</PrintOnCheckName>
<Active>true</Active>
<PrimaryPhone>
<FreeFormNumber>(415) 555-9933</FreeFormNumber>
</PrimaryPhone>
<AlternatePhone />
<Fax />
<PrimaryEmailAddr>
<Address>Cool_Cars#intuit.com</Address>
</PrimaryEmailAddr>
<DefaultTaxCodeRef />
<Taxable>false</Taxable>
<BillAddr>
<Id>4</Id>
<Line1>65 Ocean Dr.</Line1>
<City>Half Moon Bay</City>
<CountrySubDivisionCode>CA</CountrySubDivisionCode>
<PostalCode>94213</PostalCode>
<Lat>37.4300318</Lat>
<Long>-122.4336537</Long>
</BillAddr>
<ShipAddr />
<Job>false</Job>
<BillWithParent>false</BillWithParent>
<SalesTermRef />
<Balance>0</Balance>
<BalanceWithJobs>0</BalanceWithJobs>
<PreferredDeliveryMethod>None</PreferredDeliveryMethod>
</Customer>
Response:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2015-02-10T06:53:55.320-08:00">
<Customer domain="QBO" sparse="false">
<Id>3</Id>
<SyncToken>3</SyncToken>
<MetaData>
<CreateTime>2014-09-19T16:51:22-07:00</CreateTime>
<LastUpdatedTime>2015-02-10T06:53:55-08:00</LastUpdatedTime>
</MetaData>
<GivenName>Grace</GivenName>
<FamilyName>Pariente</FamilyName>
<FullyQualifiedName>Cool Cars</FullyQualifiedName>
<CompanyName>Cool Cars</CompanyName>
<DisplayName>Cool Cars</DisplayName>
<PrintOnCheckName>Cool Cars</PrintOnCheckName>
<Active>true</Active>
<PrimaryPhone><FreeFormNumber>(415) 555-9933</FreeFormNumber></PrimaryPhone>
<PrimaryEmailAddr><Address>Cool_Cars#intuit.com</Address></PrimaryEmailAddr>
<Taxable>false</Taxable>
<BillAddr>
<Id>4</Id>
<Line1>65 Ocean Dr.</Line1>
<City>Half Moon Bay</City>
<CountrySubDivisionCode>CA</CountrySubDivisionCode>
<PostalCode>94213</PostalCode>
<Lat>37.4300318</Lat>
<Long>-122.4336537</Long>
</BillAddr>
<Job>false</Job>
<BillWithParent>false</BillWithParent>
<Balance>0</Balance>
<BalanceWithJobs>0</BalanceWithJobs>
<PreferredDeliveryMethod>Print</PreferredDeliveryMethod>
</Customer>
</IntuitResponse>
Can you capture and share the raw request/response XML.
I tried the following java code and it worked fine.
Customer customer = new Customer();
customer.setId("1");
Customer cust = this.service.findById(customer);
System.out.println(cust.getPreferredDeliveryMethod());
cust.setPreferredDeliveryMethod("None");
this.service.update(cust);
System.out.println("Updated - " + cust.getPreferredDeliveryMethod());
GetById
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2015-02-10T02:10:51.595-08:00">
<Customer domain="QBO" sparse="false">
<Id>1</Id>
<SyncToken>4</SyncToken>
<MetaData>
<CreateTime>2015-02-02T20:34:19-08:00</CreateTime>
<LastUpdatedTime>2015-02-10T02:10:39-08:00</LastUpdatedTime>
</MetaData>
<GivenName>John</GivenName>
<FamilyName>Doe</FamilyName>
<FullyQualifiedName>John Doe</FullyQualifiedName>
...
<Job>false</Job>
<BillWithParent>false</BillWithParent>
<Balance>242.25</Balance>
<BalanceWithJobs>242.25</BalanceWithJobs>
<PreferredDeliveryMethod>Print</PreferredDeliveryMethod>
</Customer>
</IntuitResponse>
Update PrefDelMethod to 'None'
<Customer domain="QBO" sparse="false" xmlns="http://schema.intuit.com/finance/v3">
<Id>1</Id>
<SyncToken>4</SyncToken>
<MetaData>
<CreateTime>2015-02-02T20:34:19-08:00</CreateTime>
<LastUpdatedTime>2015-02-10T02:10:39-08:00</LastUpdatedTime>
</MetaData>
<GivenName>John</GivenName>
<FamilyName>Doe</FamilyName>
<FullyQualifiedName>John Doe</FullyQualifiedName>
...
<BalanceWithJobs>242.25</BalanceWithJobs>
<PreferredDeliveryMethod>None</PreferredDeliveryMethod>
</Customer>
Update response
<IntuitResponse xmlns="http://schema.intuit.com/finance/v3" time="2015-02-10T02:10:53.800-08:00">
<Customer domain="QBO" sparse="false">
<Id>1</Id>
<SyncToken>5</SyncToken>
<MetaData>
<CreateTime>2015-02-02T20:34:19-08:00</CreateTime>
<LastUpdatedTime>2015-02-10T02:10:53-08:00</LastUpdatedTime>
</MetaData>
<GivenName>John</GivenName>
<FamilyName>Doe</FamilyName>
<FullyQualifiedName>John Doe</FullyQualifiedName>
...
<BalanceWithJobs>242.25</BalanceWithJobs>
<PreferredDeliveryMethod>None</PreferredDeliveryMethod>
</Customer>
</IntuitResponse>
Per Intuit Developer Community, "Most probably it is a sandbox issue as it has data already setup which can sometimes cause data issues."
Yes, I have seen other data issues with Sandbox. This is the accepted answer.
I am supposed to access a a publicly accessible API (https://ABCInsuranceCoreApp.ng.bluemix.net/ABCInsurance/ProductService) using POST method. It accepts an XML Payload of the form
<Customer>
<Age>40</Age>
<Gender>M</Gender>
<Location>IBM</Location>
</Customer>
and returns a list of products. The API works in a REST-Client and tested.
What I have done in the Apigee API Dev Platform is as follows.
Default ProxyEndpoint:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
<Flows>
<Flow name="default">
<Request>
<Step>
<Name>AssignCustomerData</Name>
</Step>
<Step>
<Name>ExecuteProductService</Name>
</Step>
</Request>
<Response>
<Step>
<Name>ParseProductList</Name>
</Step>
</Response>
</Flow>
</Flows>
<HTTPProxyConnection>
<BasePath>/v1/abcinsproductservice</BasePath>
<VirtualHost>default</VirtualHost>
</HTTPProxyConnection>
<RouteRule name="default"/>
</ProxyEndpoint>
AssignCustomerData is an AssignMessage Policy and it looks like..
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="AssignCustomerData">
<DisplayName>AssignCustomerData</DisplayName>
<AssignTo createNew="true" type="request">CustomerData</AssignTo>
<Set>
<Payload contentType="text/xml">
<Customer>
<Age>40</Age>
<Gender>M</Gender>
<Location>IBM</Location>
</Customer>
</Payload>
<Verb>POST</Verb>
</Set>
</AssignMessage>
ExecuteProductService is a service callout and it looks like..
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout async="false" continueOnError="false" enabled="true" name="ExecuteProductService">
<!-- Send the message we just made to the target, and save the result -->
<Request variable="CustomerData"/>
<Response>ProductList</Response>
<HTTPTargetConnection>
<URL>https://ABCInsuranceCoreApp.ng.bluemix.net/ABCInsurance/ProductService</URL>
</HTTPTargetConnection>
</ServiceCallout>
and ParseProductList is an ExtractVriable Policy which looks like..
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables async="false" continueOnError="false" enabled="true" name="ParseProductList">
<DisplayName>ParseProductList</DisplayName>
<FaultRules/>
<Properties/>
<VariablePrefix>products</VariablePrefix>
<XMLPayload>
<Variable name="name" type="string">
<XPath>//Products/Product[1]/Name</XPath>
</Variable>
</XMLPayload>
</ExtractVariables>
I have dilligently followed the samples, however the arrangement does not work. I am confused as to where the error is.
The trace is not working either..
Can you pls help out..
Many thanks in advance
Amitava
I looks like you need to add Source to your ExtractVariables policy, as in:
<Source clearPayload="false">ProductList</Source>
Also, I'm curious why you are doing this with a ServiceCallout (rather than just routing to your target service via a TargetEndpoint)? I don't see a RouteRule in your ProxyEndpoint. Without a RouteRule, you are creating an Echo Server will will simply reflect back whatever comes in. To stop that from happening, you would need to add a RaiseFault policy after your ExtractVariables policy to terminate the call.
Or, perhaps you are just showing us a snippet and there is really more to it?
The way I see it is,
<Step>
<Name>ParseProductList</Name>
</Step>
Should be a Request Step.
So your proxy becomes,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
<Flows>
<Flow name="default">
<Request>
<Step>
<Name>AssignCustomerData</Name>
</Step>
<Step>
<Name>ExecuteProductService</Name>
</Step>
<Step>
<Name>ParseProductList</Name>
</Step>
</Request>
<Response/>
</Flow>
</Flows>
<HTTPProxyConnection>
<BasePath>/v1/abcinsproductservice</BasePath>
<VirtualHost>default</VirtualHost>
</HTTPProxyConnection>
<RouteRule name="default"/>
</ProxyEndpoint>
I would like, that if the user says "help" that the following field doesn't get filled, and that the user gets all possible options.
<form id="test">
<field name="var1">
<prompt bargein="true" bargeintype="hotword" >say xy </prompt>
<grammar src = "grammar.grxml" type="application/srgs+xml" />
<filled>
<assign name="myProdukt" expr="var1" />
you said <value expr="myProdukt"/>
</filled>
</field>
(let's say in the external grammar is "p1", "p2" and "p3", the user says "help", and the systems says "p1","p2","p3" and the user can choose again - therefore the word "help" has to be in the external grammar as well, doesn't it?)
thanks in advance
Yes, the active grammar must contain a "help" utterance which returns the value 'help'. You then catch the event with a help tag:
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml" version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml http://www.w3.org/TR/voicexml20/vxml.xsd">
<form id="test">
<field name="var1">
<prompt bargein="true" bargeintype="hotword" >say xy </prompt>
<grammar src = "grammar.grxml" type="application/srgs+xml" />
<filled>
<assign name="myProdukt" expr="var1" />
you said <value expr="myProdukt"/>
</filled>
<help>
To choose a product, say,
<!-- whatever the product choices are -->
frobinator, submarine, curling iron, ..
<reprompt/>
</help>
</field>
</form>
</vxml>
Alternatively, following the DRY principle, this effect can be done globally for your application with using an application root document containing a link element. In the example app-root.vxml document below, there is a linkbinding a global grammar "help" utterance to the help event :
<?xml version="1.0"?>
<vxml version="2.1" xmlns="http://www.w3.org/2001/vxml">
<link event="help">
<grammar mode="voice" root="root_rule" tag-format="semantics/1.0"
type="application/srgs+xml" version="1.0" xml:lang="en-US">
<rule id="root_rule" scope="public">
<one-of>
<item weight="1.0">
help
</item>
</one-of>
</rule>
</grammar>
</link>
</vxml>
This grammar will be active everywhere -- effectively merged with each active field grammar. If you need more information about application root documents, the section of the VoiceXML specification Executing a Multi-Document Application explains. Also see Handling Events from the Tellme Studio documentation
Then, in pages of your application, make reference to the application root document via the application attribute of the vxml element and speak appropriately in a help catch block:
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml" version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml http://www.w3.org/TR/voicexml20/vxml.xsd"
application="app-root.vxml">
<form id="test">
<field name="var1">
<prompt bargein="true" bargeintype="hotword" >say xy </prompt>
<grammar src = "grammar.grxml" type="application/srgs+xml" />
<filled>
<assign name="myProdukt" expr="var1" />
you said <value expr="myProdukt"/>
</filled>
<help>
To choose a product, say,
<!-- whatever the product choices are -->
frobinator, submarine, curling iron, ..
<reprompt/>
</help>
</field>
</form>
</vxml>
You could, of course, put the link code in the same page as your form, but it is likely you will want help active for every field of your application unless there is collision with something in a particular field's grammar.