Mission
This project will be re-named to GraphWalker. See graphwalker.org for more details!
org.tigris.mbt is an implementation of Model-based testing
built in java. It allows you to generate test sequences from a
finite-state machine or an extended finite-state machine. The test
sequences can be created offline, or run online
The tool itself supports no actual modeling. This is done in a separate tool, yEd from yWorks, which is available as a free download with unrestricted functionality. But org.tigris.mbt should work with any graphml-compatible editor.
org.tigris.mbt runs on any platform that is supported by java.
Download!
The tool requires Java 1.6.
Support
Visit the forums at mbttigrisorg.freeforums.org
Visit the wiki
A collection of articles can be found here .
Documentation is here Running the tool
- Copy mbt-2.2-beta15.jar and mbt.properties to the same folder of choice.
- Open a command window, and type: 'java -jar mbt-2.1-beta15.jar -v', and you should get something like this:
$> java -jar mbt-2.2-beta13.jar -v
org.tigris.mbt version 2.2 (revision 758) Beta 13
org.tigris.mbt is open source software licensed under GPL
The software (and it's source) can be downloaded from http://mbt.tigris.org/
This package contains following software packages:
crimson-1.1.3.jar http://xml.apache.org/crimson/
commons-collections-3.2.1.jar http://jakarta.apache.org/commons/collections/
jdom-1.0.jar http://www.jdom.org/
log4j-1.2.15.jar http://logging.apache.org/log4j/
commons-cli-1.2.jar http://commons.apache.org/cli/
colt-1.2..0jar http://dsd.lbl.gov/~hoschek/colt/
jung-3d-2.0.jar http://jung.sourceforge.net/
jung-algoritms-2.0.jar http://jung.sourceforge.net/
jung-api-2.0.jar http://jung.sourceforge.net/
jung-graph-impl-2.0.jar http://jung.sourceforge.net/
jung-io-2.0.jar http://jung.sourceforge.net/
jung-jai-2.0.jar http://jung.sourceforge.net/
jung-visualization-2.0.jar http://jung.sourceforge.net/
bsh-2.0b4.jar http://www.beanshell.org/
commons-configuration-1.5.jar http://commons.apache.org/configuration/
commons-lang-2.4.jar http://commons.apache.org/lang/
commons-logging-1.1.1.jar http://commons.apache.org/logging/
- You can also type: 'java -jar mbt-2.2-beta15.jar help' to investigate what mbt can do:
$> java -jar mbt-2.2-beta15.jar help
usage: 'java -jar mbt.jar [OPTION] [ARGUMENT]'
Type 'java -jar mbt.jar help ' to get specific help about a command.
Valid commands are:
gui
help
manual
merge
methods
offline
online
requirements
soap
source
xml
Type 'java -jar mbt.jar -v (--version)' for version information.
Quick start guide
offline - Generate a test sequence
Let's create a test sequence from a simple model of
www.amazon.com, which is called
UC01.graphml.
We want to create an offline test sequence, that is generated by
random, but we want the generation to stop when we have passed all
vertices. The command for doing this would look like this:
$>java -jar mbt-2.2-beta15.jar offline -g RANDOM -s EDGE_COVERAGE:100 -f model/UC01.graphml
e_init
v_BrowserStopped
e_StartBrowser
v_BrowserStarted
e_EnterBaseURL
v_BaseURL
e_SearchBook
v_SearchResult
e_ClickBook
v_BookInformation
e_AddBookToCart
v_OtherBoughtBooks
:
:
Let's examine the command a bit closer:
offline - This is the command of
mbt that
will make it generate an offline test sequence. The sequence is always
printed to the console, to standard output. If you want it to a file,
you can always redirect it using '>' .
$>java -jar mbt-2.2-beta15.jar offline -g RANDOM -s EDGE_COVERAGE:100 -f model/UC01.graphml > my_test_sequence.txt
-g RANDOM - This tells
mbt that the sequence should be generated in a randomized fashion. Possible generators for generating test sequences are:
| Generator | Description |
| A_STAR | Will try to generate the shortest possible test sequence through a model.
This is very good when trying to find the fastest path with
complete coverage in a model. The downside is that it only works on
smaller models. If used on large models, mbt will take a lot of CPU time, computing the shortest path. See Wikipedia article: A* search algorithm |
| SHORTEST_NON_OPTIMIZED | This is a compromise between A_STAR and RANDOM. The algorithm works as follows: - Choose an edge not yet visited by random.
- Select the shortest path to that edge using Dijkstra's algorithm (See Wikipedia: Dijkstra's algorithm)
- Walk that path, and mark all those edges as visited.
- When reaching the selected edge in step 1, start all over, repeating steps 1->4.
The algorithm works well an very large models, and generates reasonably short sequences. |
| RANDOM | This algorithm selects an out-edge from a vertex by random, and repeats the process in the next vertex. |
-s EDGE_COVERAGE:100 - This gives
mbt a
stop condition. In this case, 100% coverage of all edges. It means that
whenever that stop conditions is evaluated to true,
mbt will immediately halt the test sequence generation. Possible stop conditions are:
| Stop condition | Description | Value |
| VERTEX_COVERAGE | The amount of vertex coverage, in percent of the model. | An integer between 1 and 100. |
REACHED_EDGE | Stop at designated edge. | The name of an edge. |
NEVER | Continue for ever. | N/A |
| REQUIREMENT_COVERAGE | Run until a certain amount of percentage of requirement coverage is reached. | An integer between 1 and 100. |
| REACHED_VERTEX | Stop at designated vertex. | The name of a vertex. |
| TEST_DURATION | Run the test for certain period of time. | The time, given in seconds. |
| REACHED_REQUIREMENT | Run the test until a specific requirement is reached. | The name/tagid of the requirement. |
| TEST_LENGTH | How
long the test sequence should be. This is given as how many pairs of
edges/vertices should be generated. One pair gives 2 lines to the
console output, one edge and one vertex. | An integer. |
| EDGE_COVERAGE | The amount of edge coverage, in percent of the model. | An integer between 1 and 100 |
-f model/UC01.graphml - This tells
mbt what model to use. It can be one graphml file, but it can also be a folder.
requirements - Find and list all requirements in a model
mbt has
the capability of keeping track of requirements. What this means, is
that you have the possibility to tag your requirements into your model.
Later on, when executing tests, you will know which requirements were
tested, and if they passed or failed.
Look at the model
www.amazon.com.
The requirements are tagged in the model using the 'REQTAG' tag. The
command below, lists all requirements found in that model, and writes
them to the console in alphabetical order:
$> java -jar mbt-2.2-beta15.jar requirements -f model/UC01.graphml
UC01 2.2.1
UC01 2.2.2
UC01 2.2.3
UC01 2.3
methods - Find and list vertices and edges, by name
This command
lists all vertices and edges by their names and writes them
to the console in alphabetical order. This is practical to know when
implementing a tool which shall execute the actual tests.
$> java -jar mbt-2.2-beta15.jar methods -f model/UC01.graphml
e_AddBookToCart
e_ClickBook
e_EnterBaseURL
e_SearchBook
e_ShoppingCart
e_StartBrowser
e_init
v_BaseURL
v_BookInformation
v_BrowserStarted
v_BrowserStopped
v_OtherBoughtBooks
v_SearchResult
v_ShoppingCart
merge - Write a model to the standard output
When working with large and complex models, it is
usually practical to break them down into subgraphs. To see what the
actual model will look like, you need to merge the model using
this command.
$> java -jar mbt-2.2-beta15.jar merge -f model/UC01.graphml
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns/graphml http://www.yworks.com/xml/schema/graphml/1.0/ygraphml.xsd"
xmlns:y="http://www.yworks.com/xml/graphml">
:
:
The output of this commands needs
to be redirected to a file. Open the file in yEd, and there, use a
Layout Algorithm do make it look good.
xml - Wrap all fancy options into one xml file
The command xml, enables you to put all command and
options into on single xml file. For instance the command:
$> java -jar mbt-2.2-beta15.jar offline -g RANDOM -s EDGE_COVERAGE:100 -f model/UC01.graphml
could also be expressed in a xml file as:
NOTE: copy this file [mbt_setup.dtd] to the same folder as the xml file.
So the new command would be:
$> java -jar mbt-2.2-beta15.jar xml -f xml/offline.xml
e_init
v_BrowserStopped
e_StartBrowser
v_BrowserStarted
e_EnterBaseURL
v_BaseURL
e_SearchBook
v_SearchResult
:
:
soap - Run mbt as a web services
The command soap, enables you run mbt as web services. The purpose of running mbt as web services, is that other testing tools which also understands web services, now can communicate with mbt. For instance, Quick Test Professional [QTP] from HP, has that capability.
The soap command needs a xml file, containing all
information regarding the test run. In the example below, I'm using the
same xml file from above.
$> java -jar mbt-2.2-beta15.jar soap -f xml/offline.xml
Now running as a SOAP server. For the WSDL file, see: http://myComputerName:9090/mbt-services?WSDL
Press Ctrl+C to quit
You can now open the WSDL file browsing to: http://myComputerName:9090/mbt-services?WSDL.
Available requests are:
| Request | Description | Indata | Outdata |
SetCurrentVertex | Changes the current state in the model. | The name of the new current state of the model. If an empty string is given, the default value will be the START vertex in the model. If given vertex does not exist in the model, nothing happens, and the current vertex is unaffected. [String] | The name (label) of the vertex to be the new current vertex in the model. [String] |
GetDataValue | Retrieves the value of a variable in the model. (Only if the model is EFSM, extended finite-state machine) | The name of the variable [String] | The current value of that variable [String] |
ExecAction | Executes an action on an object in the model. | The action [String] | The outcome of the action. [String] |
| GetNextStep | Retrieves the name of the next vertex or edge to execute. | N/A | The name of the label of the edge or the vertex. [String] |
GetStatistics | Retrieve the statistics of the run. | N/A | The statistics of the run. [String] |
HasNextStep | Asks mbt if there is any more edges or vertices to execute. | N/A | Returns true if there still are steps to do, else false. [String] |
Load | Restart mbt with a new xml file. | The name of the xml file. | Returns true if the operation was succefull, else false. [String] |
Reload | Restart mbt with the current xml file. | N/A | Returns true if the operation was successful, else false. [String] |
An example of a script in QTP, executing a test using mbt.
WebService("SoapServicesService").SetTOProperty "WSDL", "http://myComputerName:9090/mbt-services?WSDL" If ( not WebService("SoapServicesService").Reload() )Then
Reporter.ReportEvent micFail, "MBT failure", "MBT
encountered an error. See the MBT log files for information." ExitTest End If Do until not WebService("SoapServicesService").HasNextStep() action = WebService("SoapServicesService").GetNextStep() If len(action) > 0 Then If not Eval( action ) Then
Reporter.ReportEvent micFail, "Script failure", "The script encountered
an error when trying to run function: " & action ExitTest End if End If Loop Reporter.ReportEvent micDone, "MBT Statistics", WebService("SoapServicesService").GetStatistics() |
The script above executes within QTP, and calls mbt until the stop condition is reached. The request to GetNextStep, which returns a string, is put into the Eval which will call the appropriate function.
gui - Run mbt with a graphical user interface
The command gui will launch mbt with a GUI.
$> java -jar mbt-2.2-beta15.jar gui
source - Generate stub code
The command source will generate source code
for you. It will use a template, and write the code to the console. The
template used in the example below is java.template, which will generate a stub for you.
$> java -jar mbt-2.2-beta15.jar source -f model/UC01.graphml -t templates/java.template
/**
* This method implements the Edge 'e_AddBookToCart'
*/
public void e_AddBookToCart()
{
log.info( "Edge: e_AddBookToCart" );
throw new RuntimeException( "The Edge: e_AddBookToCart is not implemented yet!" );
}
/**
* This method implements the Edge 'e_ClickBook'
*/
public void e_ClickBook()
{
log.info( "Edge: e_ClickBook" );
throw new RuntimeException( "The Edge: e_ClickBook is not implemented yet!" );
}
:
:
You can make you own template. Let's look at the java.template:
/** * This method implements the {EDGE_VERTEX} '{LABEL}' */ public void {LABEL}() { log.info( "{EDGE_VERTEX}: {LABEL}" ); throw new RuntimeException( "The {EDGE_VERTEX}: {LABEL} is not implemented yet!" ); } |
The keywords which are going to be replaced by relevant data are:
| Keyword | Replaced by |
| {EDGE_VERTEX} | Either the word Vertex or Edge. |
{LABEL} | The name of the edge or the vertex. |
Demo and examples
Demo
An example of a model that depicts a demo of the www.amazon.com site. It uses the Extended Finite-State machine notation. Which means, that in this model, mbt keeps track of how many books the user has put in the shopping cart during the test.
Go to the demo.
Examples
Samples of simple models are can be found here . To open the models in a graph editor, please go to yEd of yWorks , and get their graph editor.
Go to the examples.
How to's
A collection of how to .
FAQ
A collection of Frequently Asked Questions .
Related resource
Other