Skip to content

Software Development News: .NET, Java, PHP, Ruby, Agile, Databases, SOA, JavaScript, Open Source

Methods & Tools

Subscribe to Methods & Tools
if you are not afraid to read more than one page to be a smarter software developer, software tester or project manager!

Ranorex.com: Latest News
Syndicate content
Latest news from Ranorex
Updated: 11 hours 38 min ago

Ranorex Customer Experience Survey

Thu, 12/18/2014 - 13:02
Thank you for taking the time to participate in our survey.

The input you provided in the survey is invaluable for us because it enables us to take a closer look at our current work and make adjustments and improvements wherever it is necessary. 
We value your opinion and would like to thank you again for taking the time to participate in our survey.

You can find the most pertinent data summarized in the following infographic:




Categories: Vendor

YUI Library Support Now Improved by Ranorex

Tue, 12/16/2014 - 12:10
With Ranorex 5.2 the support of the Yahoo! User Interface (YUI) library has been improved. Start testing your web application based on the JS/CSS Framework.




Download latest Ranorex version and start YUI testing  

Upgrade for free with your valid subscription (You'll find a direct download link to the latest version of Ranorex on the Ranorex Studio start page.)
Categories: Vendor

Why Test Automation Fails – Free Special Webinar held by Jim Trentadue

Fri, 12/05/2014 - 11:25
We are proud to announce a special webinar presented by Ranorex Professional Jim Trentadue entitled "Why Test Automation Fails".

  

Challenges in automation which testers face often lead to subsequent failures. Learn how to respond to these common challenges by developing a solid business case for increased automation adoption by engaging manual testers in the testing organization, being technology agnostic, and stabilizing test scripts regardless of applications changes.
Learn Jim Trentadue’s explainations of a variety of  automation perceptions and myths:
  • The perception of significantly increased time and people to implement automation.
  • The myth that once automation is achieved, testers will not be needed.
  • The myth that automation scripts will serve all the testing needs for an  application.
  • The perception that developers and testers can add automation to a project without additional time, resources or training.
  • The belief that anyone can implement automation.

Jim Trentadue has more than fifteen years of experience as a coordinator/manager in the software testing field. As a speaker, Jim has presented at numerous industry conferences, chapter meetings, and at the University of South Florida's software testing class.

Register for the free webinar "Why Test Automation Fails " to be held on December 11, 2014, at 10:00 AM EST / 04:00 PM CET.
Categories: Vendor

Visit Ranorex at Software Quality Days 2015

Thu, 12/04/2014 - 10:55
Ranorex will be participating in  Software Quality Days 2015 , Europe's leading conference on software quality, which takes place in Austria.

The 7th Software Quality Days will take place at the "Austria Trend Hotel Savoyen Vienna" from January 20th to 23rd, 2015 and is aimed at quality assurance professionals, product managers and software testers. 


  




The conference focuses on everything to do with system and software quality. Keynote speeches, practical lectures, expert talks and workshops will present the latest trends and best practices in software quality management along with ideas for improving methods and processes. Interact with software testing experts and learn from presentations provided by industry experts.

Visit our booth and learn more about test automation with Ranorex. See how to make your automated testing more effective and get answers to your questions directly from Ranorex professionals.

Don't miss the German-language session entitled "Ein Web-Test fĂĽr multiple Plattformen - Design Tips for Testability" on January the 21st (14:00-14:35, Solution Provider Forum) which will be presented by our own Hubert Gasparitz.  We look forward to seeing you there!
Categories: Vendor

Ranorex 5.2.1 Released

Thu, 11/27/2014 - 10:00
We are proud to announce that Ranorex 5.2.1 has been released and is now available for download. General changes/Features
  • Added support for Firefox 34
  • Added an overload to the RepoItemInfo.Exists method taking a timeout value which overrides the effective timeout of the repository item for that call
  • Extended the RanoreXPath Weight Rules editor to allow copy & paste of multiple rules (for import/export)
Please check out the release notes for more details about the changes in this release.

Download latest Ranorex version here.
(You can find a direct download link for the latest Ranorex version on the Ranorex Studio start page.) 

Categories: Vendor

Integrating Ranorex Test Cases into Jira

Wed, 11/26/2014 - 15:07

Jira is an issue and project tracing software from Atlassian. The following article describes integrating Ranorex Test Cases into Jira. That way you will empower Ranorex to submit or modify testing issues within Jira in an automated way.

Jira-Integration

As Jira offers a REST web service (API description available here), it becomes possible to submit issues automatically. This is achieved using the JiraRestClient  and RestSharp.

These libraries are wrapped with Ranorex functionality, forming re-usable modules, available within this library. The integration of these Jira testing modules into Ranorex Test Automation is described subsequently.

The following steps need to be done:

Step 1 – Adding the Libraries to Ranorex for Jira Automation:

Predefined modules (for x86 architecture and .NET 3.5) are available here. The assemblies in this zip-file just need to get added to the Ranorex project. In succession the modules (as shown below) will appear in the module browser under “JiraReporter” (demonstrated on the Ranorex KeePass sample):

AddReference

Step 2 – Using the Modules in the Ranorex Test Suite

Individual modules are available within the “JiraReporter” project. These modules merely need to get used within the Ranorex Test Suite, as shown below:

Modules_TestSuite

The modules are interacting with Jira, based on the results of the related test cases. Except the initialization module, it is recommended placing the modules in the test case’s teardown.

Available modules for Jira automation:

  • InitializeJiraReporter — This module establishes the connection to the Jira server. It is mandatory for the following modules to be functional.
  • AutoCreateNewIssueIfTestCaseFails — If the test case fails, an issue is automatically created on the server, which is defined in “InitializeJiraReporter”. An issue number is automatically created by the server.
    A compressed Ranorex report is uploaded automatically as well.
  • ReOpenExistingIssueIfTestCaseFails — If the test case fails, an existing and already closed issue gets re-opened.
  • ResolveIssueIfTestCaseSuccessful — If the test case is successful, an existing and already open issue is set to “resolved”.
  • UpdateExistingIssueIfTestCaseFails — If a test case fails, attributes of an existing issue are updated.

 

Step 3 – Configure Parameters for the Modules

The modules expose different variables for configuration. Each module accepts different parameters, but they’re all used in the same way among the modules. Which module accepts which parameters can be seen when using the modules in the Ranorex project.

  • JiraUserName: The username to connect to the Jira server.
  • JiraPassword: The password for the specified user.
  • JiraServerURL: The URL for the Jira server.
  • JiraProjectKey: The project key as specified in Jira (e.g. MYP).
  • JiraIssueType: An issue type, as available in Jira (e.g., Bug)
  • JiraSummary: Some free summary text for the issue.
  • JiraDescription: Some free description text for the issue.
  • JiraLabels: Labels for the issue separated by “;” (e.g., Mobile; USB; Connection)
  • JiraIssueKey: The key for the respective issue (e.g., MYP-25).

 

The configuration of the modules is then done with common Ranorex data binding:

DataBinding

… and you’re done:

In succession, Ranorex will automatically interact with Jira when one of the modules is executed. The issues can then get processed in Jira. The following figure shows an automatically created issue together with its attached report:

JiraPic

 

Advanced usage:

The JiraReporter project offers two more modules; (i) the module “OnDemandCreateNewIssueIfTestCaseFails” and (ii) the module group “ProcessExistingIssue”. These modules offer further convenience functionality and are explained in more detail in succession.

Module Group – ProcessExistingIssue

This module group groups the following modules in the given order:

  • ReOpenExistingIssueIfTestCaseFails
  • UpdateExistingIssueIfTestCaseFails
  • ResolveIssueIfTestCaseSuccessful

It might be useful to process an existing issue, as it reopens and updates the issue automatically in case of a failure. Otherwise, if the test case is successful, it closes the issue.
Thus, it can be used to monitor an already known and fixed issue. To use this module group, the whole Ranorex  “JiraReporter”project, available on GitHub needs to get added to the solution.

OnDemandCreateNewIssueIfTestCaseFails

This module provides functionality, creating a new issue out of the Ranorex Report. A new issue only gets created when the link, provided within the report is clicked. So the user or tester can decide whether an issue is create or not.

The compressed Ranorex report is uploaded to the newly created issue as well.

rxReport

Note: This functionality relies on a batch file created by Ranorex in the output folder and the execution of the Jira Command Line interface (CLI). It does not depend on a prior initialization from “InitializeJiraReporter”.

The module exposes the same variables as the modules mentioned above. One additional parameter is essential for this module:

  • JiraCLIFileLocation: The full path to the “jira-cli-<version>.jar” file, provided by the Jira CLI.

Following requirements need to be met to use this module:

  • Remote API must be enabled in your JIRA installation
  • The mentioned batch file needs to be accessible over the same file path, where the file was initially created. If the file is moved to a new location, the link is not working anymore.
    In this case the batch-file needs to be started manually.

 

JiraReporter Source Code:

The whole project which contains the code for the JiraReporter is available on GitHub under the following link:

https://github.com/ranorex/Ranorex-Jira-Integration

Please feel free to modify the code according to individual needs and/or upload new modules.

 

Categories: Vendor

iOS 8.1 App Testing

Thu, 11/20/2014 - 10:00
Ranorex 5.2 comes with full support for Apple’s brand new mobile operating system.

Save time by automating your iOS 8.1 apps.

Download Ranorex 5.2

Upgrade for free with your valid subscription (You'll find a direct download link to the latest version of Ranorex on the Ranorex Studio start page.)
Categories: Vendor

Out-Of-The-Box Support for Qt Testing

Thu, 11/13/2014 - 14:16
Full support for Qt for both the web and desktop environment is now part of Ranorex object recognition.  Start your out-of-the-box Qt testing now .


Download Ranorex 5.2

Upgrade for free with your valid subscription (You'll find a direct download link to the latest version of Ranorex on the Ranorex Studio start page.)
Categories: Vendor

Webinar: Measurably Improve Requirements Management and Software QA

Tue, 11/11/2014 - 10:36
We are proud to announce a German-speaking co-webinar presented by Ranorex and Polarion Software entitled " Measurably Improve Requirements Management and Software QA ".



In today's world, development cycles are getting shorter, and moreover quality should be improved while costs are reduced. This can only be achieved through the full integration of requirement management, project management and testing along with a significant increase in automation.

In this webinar you will learn how using Ranorex together with Polarion can measurably improve your requirements management and software QA through collaboration.

Join the presenters for this web seminar to be held on November 18, 2014, at 11:00 a.m. CET.
Categories: Vendor

GWT Now Fully Supported by Ranorex - Start GWT Automated Testing

Thu, 11/06/2014 - 15:14
With Ranorex 5.2 the support of Google Web Toolkit has been improved.
Start testing your GWT based web application now.

GWT Test Automation

Download Ranorex 5.2 and start GWT Test Automation

Upgrade for free with your valid subscription (You'll find a direct download link to the latest version of Ranorex on the Ranorex Studio start page.)
Categories: Vendor

Create and Share your own Custom Actions for the Recorder

Thu, 11/06/2014 - 10:53

This article explains how custom actions can be implemented and used directly within Ranorex Recorder. Additionally, it provides an example implementation of a custom (user code) action. It furthermore describes how this action can easily be shared – e.g. to also make such actions available for non-programmers, mainly through the use of Ranorex Recorder.

Custom-Smart-Actions

Although Ranorex Recorder provides a number of smart actions to be used in various automation scenarios (Set Value, Close Application, etc.), it might be useful to provide custom smart actions (i.e. user code actions) tailored to your everyday automation needs.

User code actions are even more powerful since they now allow arguments of various data types, first and foremost a data type for repository items. This comes with a possibility for making custom actions more flexible and adjustable since repository items can be assigned as arguments in the Ranorex Recorder.

Since very often different scenarios demand different solutions, we would also like to see your “top custom actions” on our user voice platform. This platform allows users to share ideas and also vote for implementations that have been shared by others in the community. Let’s build up a useful library of custom actions!



Example: Step-by-Step Instructions for Custom “Key Sequence and Validation” Action

We can assume that someone needs to automate a key sequence on a text box located on a website, followed by a subsequent validation. These two actions then need to be performed for several text boxes throughout the test. Although this scenario can easily be implemented with copy and paste (producing lots of redundancies), in best practice it is realized using the following steps:

1. Merge Relevant Items to a “User Code” Action

Merge the relevant actions into a user code item using the context menu and provide a meaningful name for this newly created action, e.g. “KeySequenceAndValidate”.

Merge-Relevant-Actions

Now these two steps are available as one “UserCode” action within the current recording. It can easily be called multiple times, but the underlying actions are still static and inflexible, being performed on the same “hardcoded” repository element and key sequence.

2. Make Action Flexible by Providing Arguments

Click the “Args…” button to bring up the argument editor, allowing you to create input parameters (i.e. arguments) for this user code action.

Name-Of-User-Code-Action

These arguments will later allow the action to be performed on any assigned repository item with any key sequence provided – without the need to modify the action itself.

Argument-Editor

For this sample, a parameter of type “Adapter” (representing the repository element) is needed as well as a parameter of type “String” representing the key sequence (more information on user code parameters).

3. User Parameters in User Code

Resulting from the modifications in the argument editor, two new arguments have been added to the header of the user code action “KeySequenceAndValidate”. These arguments can be reviewed in the <RecordingName>.UserCode.cs (or *.vb) file:

public void KeySequenceAndValidate(Ranorex.Adapter MyTextBox, string MyKeySequence)
{
    ...
}

The usage of the static repository item and key sequence should now be made flexible by using the given arguments so replace the hardcoded “repo.RanorexWebsite.InputTagQ” with the parameter “MyTextBox”. Additionally replace the hardcoded key sequence “Ranorex” with the parameter “MyKeySequence”. After these modifications and after dropping the two lines starting with “Report.Log(…”, your code should look like this:

public void KeySequenceAndValidate(Ranorex.Adapter MyTextBox, string MyKeySequence)
{
    MyTextBox.PressKeys(MyKeySequence); // Perfom key sequence action
    Validate.Attribute(MyTextBox, “InnerText”, MyKeySequence ); // validate result
}

Note: Logging (“Report.Log…”) has been removed in the sample above. Detailed information on custom logging from code can be found in our user guide.

Now this action can easily be called from the recorder view (see screenshot below) whenever these steps need to be performed. Since this user code action is now completely adjustable, the repository item as well as the key sequence can be provided as arguments in the recorder’s action table.

User-Code-Action-With-Arguments

Consequently the same action could also be called from another position to be performed on another repository item with another key sequence. To reuse existing custom actions, click “Add New -> User Code Action” and choose the desired method from the drop down. To quickly assign repository items, the drag and drop feature can be used (see screenshot below).

Assign-Repo-Item-To-User-Code-Action


Spread your Custom Action by Inheriting from a Base Class

When implementing the steps described above, the custom user code action is available within the current recording only. Usually with bigger projects, there is likely a need to call this method from multiple recording modules. This can be achieved by using a simple trick: inheritance!
To start with the inheritance approach, first add a new item from type “Class” to your Ranorex Project and give it a meaningful name, e.g.: RecorderBaseClass (see screenshot below). It will be your base class for future as well as existing recordings.

Add-New-BaseClass

Now move the code of your custom action “KeySequenceAndValidate” from the “UserCode”-file to the newly created class.

Move-Code-Snippet-To-BaseClass

 

Finally, every recording that should have access to the methods provided in the base class needs to be modified with a simple change: derive the recording’s user code from the base class. Simply open the <RecordingName>.UserCode.cs file and add a colon followed by the name of the base class to the existing declaration of the class (see screenshot below).

Derive-Recording-From-BaseClass

Doing so, all methods from the base class are combined (globally shared) with the ones from the corresponding user code file (locally shared) and are also automatically available in the recording.

Reuse-Derived-Smart-Action

 

This approach can be applied to all new and existing recordings.

Advanced Example: Validate Content of Whole Table

Even more complex scenarios can be implemented with the workflow described above. Assuming the content of a whole table needs to be validated, using a user code action to accomplish this can save a lot of time, especially if the table to be validated can be passed as a parameter. Please find a sample implementation of the described scenario in our code examples: Advanced Validation – Whole Table.

Post Your Top Use Case

Apart from the use cases mentioned above, you might have other frequently used cases of custom actions. To share them with others, please visit http://uservoice.ranorex.com and contribute your custom actions! Also feel free to vote for ideas and implementations being shared by other Ranorex users. Top voted custom user codes might later be added to the default set of Ranorex actions.

Conclusion

User code actions can be extended with arguments of various data types whereas the Repository Item might be the one with the biggest impact. It allows a user to create custom actions (e.g. key sequence and a following validation) completely independent of a specific repository item. By using inheritance, these custom actions can easily be shared and therefore can be used in the Ranorex Recorder by someone without development skills. Concrete examples of custom actions and inheritance were shown, including the complex validation of the content of an entire table.

Categories: Vendor

Reminder for December Workshops

Tue, 11/04/2014 - 08:45
We are very pleased to remind you about our upcoming online Ranorex training course, scheduled for December.



Get firsthand training with Ranorex professionals and learn how to get the most out of Ranorex Studio at one of these workshops.

Look at the schedules for additional workshops in the next few months.
Categories: Vendor

Integrate Ranorex Tests in andagon’s ALM tool aqua

Wed, 10/29/2014 - 09:40

Guest blog post by Stefan BĂĽssemaker, Innovation Manager at andagon GmbH

This blog post will illustrate the interaction between Ranorex and the application lifecycle management solution aqua.

In a few simple steps you can expand your Ranorex test cases with the powerful ALM tool aqua.



What is aqua? What is ALM?

aqua is an ALM (=Application Lifecycle Management System), which is a software product to control and manage IT projects in one solution. aqua is based on five pillars:

  • project management for initialise, planning, controlling and finalising projects
  • requirement management for document requirements, analyse risks and control changes
  • test management for manual and automated software tests
  • defect management for preventing and minimize the impact of bugs
  • reporting to summarise the state of developing process

 

Requirements, tests and defects are clearly structured by visually hierarchic structure for a comprehensible traceability. aqua is intuitive and easy to use, because it is based on the Microsoft look and feel environment, which everybody knows of products like Microsoft Word.

All components can be specified by attributes for uniform documentation. Test cases can be parameterized with test data for manual and automated tests. Automated test scripts expand test cases with tools like

  • Ranorex: functional record and replay test automation tool
  • JMeter: non-functional load and performance tool
  • SoapUI: functional web service testing tool
  • Databases: for checking database queries
  • Shell: for executing Unix commands

 

Moreover an agile board is available for working in an agile scrum developing process.

The integrated report module allows the management to create customized reports from the current state of developing process within a few seconds.

The Integration of Ranorex in aqua? And what is an Agent?

Ranorex is completely integrated in aqua, which gives the testers more opportunities to work with Ranorex.

A Ranorex automated test script is stored behind a documented test case in aqua, which represents the abstract functionality.The test case is expandable with other automated test scripts or manual test steps.

This automated test case can be executed by aqua on a distributed pool of agents. An agent is a simple program which bidirectional connects aqua and Ranorex Runtime together on a distributed operating systems.

This results in several advantages.

  • the tester’s desktop is not blocked while test case execution
  • the duration of execution can be divided by the number of agents
  • scripts can be automatic connected with a documentation
  • test cases can be specified and bundled for test management
  • adjustment of test scripts can be distributed to different testers
  • best workload of agents is ensured of aqua

 

With this functionality of aqua it is possible to bundle selected test cases dynamically into test scenarios for Regression Tests of Unit Tests, Feature Tests, Smoke Tests or Acceptance Tests.

This allows to faster receive the actual quality condition of the system and find bugs early after implementation. With the traceability of test cases, requirements and test cases are easier to review and further to find duplicated or obsolete bugs. The results of executed tests are stored historically in aqua.


Reporting with aqua

In aqua you have two possibilities to report the actual state of the developing and test process.

On the one hand you have a real time dashboards like pie charts, burn down charts or column charts, which can be customized for your needs.

On the other hand you have the possibility to create a customized report with even more details.

You can, for example, summarize your status of all test cases which are connected to all requirements in one sprint or release. Summarized you have the possibility to track your development project in real time and can compile key figures with one click.

Conclusion

Aqua and Ranorex are a great combination between automated functional testing and test management.

It is very easy to expand your test framework with requirement management and defect management.

The test framework scales with the number of test cases and number of testers, which helps to control the testing process quick and easy. The time of monitoring and reporting will be reduced as well as the duration of test cases.

For more information please have a look at the following video:
http://www.andagon.com/en/videos/software-solution-aqua.html#c1395

Categories: Vendor

Newly Supported JS Frameworks

Tue, 10/28/2014 - 10:51
Ranorex 5.2 introduces support for many web development frameworks based on dynamic content.

Start automate testing your web applications based on java script frameworks like OZONE Widget Framework, Sencha ExtJS…



Download Ranorex 5.2 now…

Upgrade for free with your valid subscription (You'll find a direct download link to the latest version of Ranorex on the Ranorex Studio start page.)
Categories: Vendor

Introducing Ranorex 5.2

Tue, 10/21/2014 - 13:37
We are pleased to announce that Ranorex 5.2 is now available for download!
This latest release considerably extends the object recognition capabilities of Ranorex for desktop, web and mobile application testing: out-of-the-box test automation for Qt applications on the desktop and in web environments as well as a lot of newly supported web development frameworks… and of course full support for iOS 8.

In addition to the newly supported technologies, the out-of-the-box robustness of the Ranorex Recorder has been dramatically improved.

Finally, the release Ranorex 5.2 introduces more smart and flexible custom actions, which means that different argument types for user code actions are possible. This is especially interesting as you can now pass repository items to user code actions – this of course enables powerful possibilities like providing a framework for smart test actions, defining generic technology independent get/set value actions, combining several related actions into one user code action, implementing complex validations and more!

For an overview of all the new features, check out the release notes .



Upgrade for free with your valid subscription (You'll find a direct download link to the latest version of Ranorex on the Ranorex Studio start page.) Newly Supported Web Development Frameworks With Ranorex 5.2, the support for many new web development frameworks has been added (Yahoo User Interface Library, jQuery, ASP.net, GWT, MS Dynamics CRM, ExtJS, Sencha, Ozone Widget, etc.). This brings web object recognition to the next level!
Out-Of-The-Box Support for Qt Full support for Qt for both the web and desktop environment is now part of Ranorex object recognition.  Start your out-of-the-box Qt testing now .
Even Smarter Custom Actions Ranorex 5.2 introduces new parameter types for user code actions including repository items. There are so many potential uses, for example building up a whole generic test automation library that you can use in your test automation team or in performing complex validations. Think of the possibilities!  Learn more about smart custom actions .
Full Support of iOS 8.1 Ranorex 5.2 comes with full support for Apple’s brand new mobile operating system. Save time by automating your iOS 8 apps .
Categories: Vendor

Microsoft Test Automation Workshop Powered by Ranorex and profi.com

Thu, 10/16/2014 - 13:33
Learn more about test automation using Ranorex in combination with Microsoft tools.



Interested in this three-day German-speaking intensive workshop?
For all the details, please have a look at the workshop info flyer…
Categories: Vendor

imbus AG - New European Service Partner

Tue, 10/14/2014 - 10:53
As we have rapidly grown our presence and customer base in Europe, we have also seen an increasing demand for Ranorex consulting and implementation services. To help meet this demand, we have the pleasure of announcing that we have partnered with imbus AG.

imbus AG
is one of Germany’s leading specialists for software quality assurance and test. With more than 230 employees at four locations, imbus supports companies and IT-users in verifying and validating complex and demanding software systems, as well as in the optimization of their software development processes.

For more information about imbus AG, please visit http://www.imbus.de/


Categories: Vendor

Ranorex is "ATI Automation Honors Runner-Up"

Thu, 10/09/2014 - 12:10
We at Ranorex are pleased to announce that Ranorex has been chosen as the "ATI Automation Honors Runner-Up" in the sub-category ".NET".

This is the fifth time that the Automated Testing Institute (ATI) has awarded the ATI Automation Honors to companies developing the best commercial functional automated test tools. These awards celebrate excellence in the discipline of software test automation.  

Categories: Vendor

Visit Ranorex at EuroSTAR 2014

Tue, 10/07/2014 - 10:11
Ranorex will be participating in the EuroSTAR Conference, which this year takes place in Ireland for the first time. Visit us at the Convention Centre in Dublin from the 24th to the 27th of November, 2014.
The EuroSTAR Conference is Europe's premier software testing conference. It has grown to become the largest and most prestigious event on the software testing calendar.

The annual conference takes place over 4 days with full-day & half-day tutorials, workshops and activities, dozens of track sessions, networking and community-building events, an interactive test lab and an exhibition.

We look forward to seeing you there!

Categories: Vendor

Reminder for November Workshops

Mon, 10/06/2014 - 11:57
We are very pleased to remind you about our upcoming online Ranorex training course, scheduled for this fall.



Get firsthand training with Ranorex professionals and learn how to get the most out of Ranorex Studio at one of these workshops.

Look at the schedules for additional workshops in the next few months.
Categories: Vendor