November 02
EMF4CPP version 0.0.2 released!
EMF4CPP version 0.0.2 has been recently released, including an Eclipse plug-in for generating C++ code from any Ecore metamodel.
September 08
The Cátedra SAES Team in the XV Conference on Software Engineering and Data Bases
Last Tuesday (September, 7) the Cátedra SAES Team attended the XV Jornadas de Ingeniería del Software y Bases de Datos (XV Conference on Software Engineering and Data Bases) in Valencia, Spain. Two were the workshops in which they presented their recent results.
The first workshop was called DSDM'10: Desarrollo de Software Dirigido por Modelos (Workshop on Model-Driven Development), in which the EMF4CPP was presented. EMF4CPP is an efficient C++ implementation for the Eclipse Modeling Framework, de facto stantard in MDD, providing a C++ code generator with a consistent type mapping and establishing the basis for developing a set of tools for MDD in C++. The paper presented at DSDM'10 introduces the mapping, discusses performance issues and shows motivating usage scenarios. The original contribution can be downloaded here.
The second one was called PRIS'10: Taller sobre Pruebas en Ingeniería del Software (Workshop on Software Testing), in which the work titled "A Framework for Aspect-Oriented GUI Data Verification" was presented. This framework describes a verification layer between the user interface (GUI) and the business logic that analyzes the GUI events caused by the user interaction to detect changes in the GUI. Once a change is detected, a verification process is triggered to check whether the requirements related to the interacted element are met. Furthermore, this layer uses GUI interventions to complete which is a rich and interactive verification experience. This approach assess data verification as a separated aspect, since the verification logic is transparent to the developers, and the verification rules are included in separated files. The original contribution can be downloaded here.
July 13
Item and event introspection in Qt Quick (QML + Qt Declarative)
In this post we are going to describe a solution to implement item and event introspection in a QML declarative GUI. We will use that introspection to analyze, on one hand, the items in the GUI, and on the other hand, the user interaction.
First, say that we are using a QDeclarativeView object to run a QML file:
int main(int argc, char *argv[]) { QApplication app(argc, argv); /// /// create the view from a QML file /// QDeclarativeView view; view.setSource(QUrl::fromLocalFile("../binding1/app.qml")); view.show(); ...
and a macro to do the output:
#define log(content) \
std::cout << content << std::endl;
Item introspection
First, we need a name to identify the items in a GUI. Since the item name proterty (i.e. objectName) is empty by default, we rename all the items as follows:
log("Renaming items..."); Supporting::renameItems((QObject*)view.rootObject(),0,"root/");
The renameItems() code:
static void renameItems(QObject* obj, int childpos, const std::string& path) { ///if the widget has a name, do nothing if ( obj->objectName() != "" ) return; ///else, we return a an alternative name composed of: /// - a special character /// - the accumulated path /// - the position respect to the parent /// - the class name //complete the path QString accPath = QString(path.c_str())+ QString::number(childpos); //compose the name QString name = QString ( "!" ) + accPath + "_" + obj->metaObject()->className(); //set the name obj->setObjectName(name); /// /// name the children /// int i = 0; foreach ( QObject *o, obj->children() ) { renameItems(o,i, accPath.toStdString() + "/"); i++; } }
We could also perform the renaming process using the setData() method in QGraphicsItem.
Once the items are renamed, we are going to print their name in order to show that those elements are accessible. To access the items:
- 1: get the main scene from the view's root object
- 2: get the scene items using the items() method
QGraphicsScene* scene = view.rootObject()->scene(); assert(scene); foreach(QGraphicsItem* gi, scene->items()) { if (gi && gi->toGraphicsObject()) { log("Scene item :: " << gi->toGraphicsObject()->objectName().toStdString()); } }
The result of the print process is the following:
... Scene item - installing filter :: !root/0_QDeclarativeRectangle Scene item - installing filter :: !root/0/4_QDeclarativeText Scene item - installing filter :: !root/0/4/0_QDeclarativeMouseArea Scene item - installing filter :: !root/0/5_QDeclarativeText Scene item - installing filter :: !root/0/5/0_QDeclarativeMouseArea Scene item - installing filter :: !root/0/6_QDeclarativeImage Scene item - installing filter :: !root/0/6/0_QDeclarativeMouseArea Scene item - installing filter :: !root/0/7_QDeclarativeImage Scene item - installing filter :: !root/0/8_QDeclarativeImage Scene item - installing filter :: !root/0/8/0_QDeclarativeMouseArea ...
Event introspection
The first thing we need to implement event introspection in QML is an event filter. In this case, we will use a SceneEventFilter? that is implemented as follows:
(the header code...)
#ifndef SCENEEVENTFILTER_H #define SCENEEVENTFILTER_H #include <QGraphicsItem> #include <QPainter> class SceneEventFilter : public QGraphicsItem { public: SceneEventFilter(); QRectF boundingRect() const { //do nothing return QRectF(); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { //do nothing } protected: bool sceneEventFilter(QGraphicsItem * watched, QEvent * event); }; #endif // SCENEEVENTFILTER_H
(the source file...)
#include "sceneeventfilter.h" #include <QEvent> SceneEventFilter::SceneEventFilter() {} bool SceneEventFilter::sceneEventFilter(QGraphicsItem * watched, QEvent * event) { QGraphicsObject* go = watched->toGraphicsObject(); if (go && event) { QString parent = ""; if (go->parent()) parent = "(" + go->parent()->objectName() + ")"; log("sceneEvent @ " << go->objectName().toStdString() << " " << parent.toStdString() << " # " << event->type()); } return false; }
It is very important to return false in the sceneEventFilter() method for not to handle the event.
Once we have implemented the event filter, we have to install it. In QML we need to install the filter in every QGraphicsItem composing the scene as we can see in the following code:
SceneEventFilter sef; scene->addItem(&sef); foreach(QGraphicsItem* gi, scene->items()) { if (gi) { if (gi->toGraphicsObject()) { log("Scene item - installing filter :: " << gi->toGraphicsObject()->objectName().toStdString()); } gi->installSceneEventFilter(&sef); } }
Then, when the user is interacting the GUI, these are the obtained results:
... sceneEvent @ !root/0/8/0_QDeclarativeMouseArea (!root/0/8_QDeclarativeImage) # 186 sceneEvent @ !root/0/8/0_QDeclarativeMouseArea (!root/0/8_QDeclarativeImage) # 156 sceneEvent @ !root/0/8/0_QDeclarativeMouseArea (!root/0/8_QDeclarativeImage) # 157 sceneEvent @ !root/0/8/0_QDeclarativeMouseArea (!root/0/8_QDeclarativeImage) # 187 sceneEvent @ !root/0_QDeclarativeRectangle # 25 sceneEvent @ !root/0/4_QDeclarativeText (!root/0_QDeclarativeRectangle) # 25 ...
May 05
OHT+Experience - Open HMI Tester Prototype for Usability Experience
The OHT+Experience Prototype is a tool whose aim is to extract the user experience from the interaction with a software.
User Experience represents one of the most important usability attributes, and is composed of impressions, opinions, and suggestions from the users. It is very useful for usability experts and developers to measure user satisfaction level both with the GUI and the overall behavior of a software.
This prototype allows the testers to design the briefing stage, composed of a set of test cases to be performed by the users. Then, during the test case execution, the OHT+Experience automatically conducts the test session telling the users what to do and collecting their impressions, comments, and suggestions. Finally, both the test cases and the comments are stored in a project for further analysis.
The tool also includes a test conduction assistant, which shows the elements that the user has to interact with by using visual help. This tool could be also used in many ways as for instance to ease communication between experts and developers, or to design operator guides. This prototype could be easily extended to enhance its features, or also to fit it to other testing environments.
Video 1. Recording the Use Case structure
Video 2. Using the Use Case assistant
Video 3. Watching previous feedbacks
May 05
OHT+Inspector - Open HMI Tester Prototype for Usability Inspection
The OHT+Inspector Prototype is a Usability Evaluation Tool whose aim is to perform a reviewing process over a system or a GUI based on a set of constraints and guidelines.
This process is usually conducted by a usability expert (or a group of them), who focus his/her efforts on a list of areas of the GUI design that have proved to be troublesome for users. Once the problems are discovered, the experts make recommendations for resolving these issues.
This prototype tries to encapsulate the knowledge of these experts and perform the inspection process; thus, it works as follows:
- The tool analyses the properties of a GUI
- These properties are used to create an abstract GUI using an abstraction process
- A list of previously chosen constraints and guidelines, usually created by a usability expert, are checked against the abstract GUI.
The result of the evaluation process is a set of reports including the errors discovered, and maybe some advices to fix them. These reports are stored in a usability inspection project for further analysis.
This prototype could be easily extended in order to add new evaluators, or also to fit it to other testing environments.
The following tutorial videos shows how to use this prototype.
Video 1. Creating a new project
Video 2. Reevaluating an existing project
Video 3. Exporting evaluation reports
May 05
OHT+Behavior - Open HMI Tester Prototype for Usability Interaction
The OHT+Behavior Prototype includes the basic functionality to abstract the user interaction with any application. The aim of this tool is to capture the mouse and keyboard interaction on a GUI, and return the tester a report composed of a heat map (shows how often the areas of a GUI are interacted) and a path map (shows a set of steps that summarizes the user interaction.)
It allows the usability experts to evaluate, in a very abstract level, the behavior of a set of users on a GUI, for example:
- what elements were interacted
- the sequence of performed actions
- what areas were interacted more frequently
- etc ...
This prototype could be extended in many ways, as it uses an abstract representation of the GUI events that can be extended to include other contextual information which may be very useful in testing or evaluation processes. It could be also easily adapted to other windowing systems by extending only the event capture module.
The following video shows how a new project can be created and also how to create the heath map and path map that correspond to a normal user interaction with an example application:
Video 1. Creating a new project
May 05
Come in! We are open!
We are very pleased to announce the opening of this blog with the launching of a set of new products for Usability Assessment, recently developed by Cátedra SAES-UMU, and based on the OHT+ Framework (also developed by Cátedra SAES-UMU) and available at Sourceforge too.
This framework's architecture can be adapted to many development and testing environments, mainly because it is agnostic to the operating system and the windowing system. It is based in more than fifty percent on adaptable modules, allowing testers and developers to practically build any GUI Testing Tool on top of it.
The OHT+ Products are composed of a set of open-source prototypes whose aim is measuring or evaluating several of the most important usability attributes. These tools are adapted to Qt windowing system as the default GUI System in which to perform the different usability assessment processes. Anyway, these prototypes can be easily adapted to fit them to different testing environments, or to extend its functionality.
These tools (available at Sourceforge) are:
- OHT+Behavior ( Sourceforge Project Link)
- OHT+Inspector ( Sourceforge Project Link)
- OHT+Experience ( Sourceforge Project Link)
They have been written in standard C++, and use Qt library version 4.x for the user interface; so they can be built and run in Linux, MacOs or Windows.
August 01
OHTu: OHT for usability first release
Now is available for download the first release (v0.9) of the OHTu: OpenHMI-Tester for usability.
You can download it from Sourceforge http://sourceforge.net/projects/ohtu/.
February 20
Open HMI Tester first release
Now is available for download the first release (v0.9) of the OpenHMI-Tester.
You can download it from Sourceforge http://sourceforge.net/projects/openhmitester/.
February 04
Catedra SAES-UMU agreement
This morning the Catedra SAES-UMU agreement was signed between the University of Murcia and the company SAES. Representatives of both organizations and the members of the research group attended the event.
Some news related to the event:
