The Path to Cloud – An InApp Infographic on Cloud Migration

Highlights Cloud adoption is strategic SaaS adoption has more than quintupled IaaS and PaaS adoption reaching a tipping point Data wants to be bigger in the cloud Have questions? Contact the cloud computing experts at InApp to learn more.
Top 5 Cloud Computing Trends This Year (2016)

Top 5 Cloud Computing Trends This Year (2016) Have questions? Contact the cloud computing experts at InApp to learn more.
Creating a Chat App Using NodeJS, ExpressJS, and Socket.IO
Socket.io is a trending library that allows bidirectional communication between client and server. It allows event-based communication between the client and server with very less code. It works on every platform, a browser with good speed and reliability. Node.JS is the perfect technology for real-time applications like chat applications and expressjs is the most popular web framework in Node.JS. Create an express application named chatApp “` $ express chatApp create : chatApp create : chatApp/package.json create : chatApp/app.js create : chatApp/public create : chatApp/public/stylesheets create : chatApp/public/stylesheets/style.css create : chatApp/public/images create : chatApp/routes create : chatApp/routes/index.js create : chatApp/routes/users.js create : chatApp/views create : chatApp/views/index.jade create : chatApp/views/layout.jade create : chatApp/views/error.jade create : chatApp/bin create : chatApp/bin/www create : chatApp/public/javascripts install dependencies: $ cd chatApp && npm install run the app: $ DEBUG=chatApp ./bin/www “` Move to the application folder. “` $ cd chatApp/ “` Just check the files created inside “` $ ls “` Now we need to install the dependencies. Dependencies are listed in the package.json. The current content of package.json file is “` { “name”: “chatApp”, “version”: “0.0.0”, “private”: true, “scripts”: { “start”: “node ./bin/www” }, “dependencies”: { “express”: “~4.9.0”, “body-parser”: “~1.8.1”, “cookie-parser”: “~1.3.3”, “morgan”: “~1.3.0”, “serve-favicon”: “~2.1.3”, “debug”: “~2.0.0”, “jade”: “~1.6.0” } } “` To install the dependencies use the following command. “` $ npm install “` Now if you check the app.js file you can find lots of code. Remove everything and add the following code var app = require(‘express’)(); var http = require(‘http’).Server(app); http.listen(3000, function(){ console.log(‘listening on port:3000’); }); Run the application using “` $ node app.js “` listening on port:3000 Create an index page with the following code and save the file with name index.html <!DOCTYPE html> <html> <head> <title>Chat App NodeJS+Socketio+ExpressJS</title> </head> <body> Hello world </body> </html> Now in the app.js we need to set the router for the index.html. For this add the following code inside the app.js app.get(‘/’, function(req, res){ res.sendfile(‘index.html’); }); $ node app.js listening on port:3000 Now check the URL http://localhost:3000/ Now we need to install the socket.io. You can install socket.io using the following command $ npm install –save socket.io Now check the package.json and you can find that the socket.io is added to it with the version. { “name”: “chat”, “version”: “0.0.0”, “private”: true, “scripts”: { “start”: “node ./bin/www” }, “dependencies”: { “body-parser”: “~1.8.1”, “cookie-parser”: “~1.3.3”, “debug”: “~2.0.0”, “express”: “~4.9.0”, “jade”: “~1.6.0”, “morgan”: “~1.3.0”, “serve-favicon”: “~2.1.3”, “socket.io”: “^1.3.5” } } Add socket.io into HTML code using <script src=”https://cdn.socket.io/socket.io-1.2.0.js”></script> and update index.html with the following code <script type=”text/javascript”> var socket = io(); </script> Update app.js with the following code io.on(‘connection’, function(socket){ console.log(‘New client is connected to the server’); }); Now update index.html with input box and send button <!DOCTYPE html> <html> <head> <title>Chat App NodeJS+Socketio+ExpressJS</title> </head> <body> <ul id=”messages”></ul> <form action=””> <input id=”m” autocomplete=”off” /><button>Send</button> </form> <script src=”https://cdn.socket.io/socket.io-1.2.0.js”></script> <script src=”http://code.jquery.com/jquery-1.11.1.js”></script> <script type=”text/javascript”> var socket = io(); var name = window.prompt(“What is your name?”); socket.emit(‘login’, name); $(‘form’).submit(function(){ socket.emit(‘sendMsg’,{by:name, msg: $(‘#m’).val()}); $(‘#m’).val(”); return false; }); socket.on(‘newUser’, function(name){ $(‘#messages’).append($(‘<li>’).text(name +” is online”)); }); socket.on(‘getMsg’, function(res){ $(‘#messages’).append($(‘<li>’).text(res.by +”: “+res.msg )); }); </script> </body> </html> Here we are creating a socket connection and emitting the message that the user type in the text box. We are getting the name of the user using the prompt. then sending a login event to server. Now we need to listen to these events in server and handle them properly. So open the app.js file and update the io.connection function as: io.on(‘connection’, function(socket){ console.log(‘New client is connected to the server’); //listening to the sendMsg from client. socket.on(‘sendMsg’, function(msg){ console.log(‘message: ‘ + msg); //emiting the getMsg event to all the sockets that is connected. io.emit(‘getMsg’, msg); }); //Listening to the login event. socket.on(“login”,function(name) { //emitting the newUser event to all the clients io.emit(‘newUser’, name); }); }); Now in the command line type the following code. This will run our application $ node app.js Now open your browser and go to http://localhost:3000/ and enjoy the chat Have questions? Contact the app development experts at InApp to learn more.
Understanding Security Assertion Markup Language (SAML)
What is Security Assertion Markup Language (SAML)? Security Assertion Markup Language (SAML) is an XML standard that allows secure web domains to exchange user authentication and authorization data. Using SAML, an online service provider can contact a separate online identity provider to authenticate users who are trying to access secure content. In InApp, we developed a SAML-based Single Sign-On (SSO) service in a different project that provides partner companies with full control over the authorization and authentication of hosted user accounts that can access web-based applications that we had developed. Using the SAML model, our implemented project acts as the service provider and provides services. InApp project team implemented SSO login for their MyApp Web & Mobile application project. Here SSO workflow describes based on the MyApp web application & Mobile project. Understanding SAML-based Single Sign-On (SSO) The following process explains how a user logs into a hosted web application through a partner-operated, SAML-based SSO service. Here is the detailed step which is mentioned in the image. The user attempts to reach a hosted application, for example, MyApp. MyApp generates a SAML authentication request. The SAML request is encoded and embedded into the URL for the partner’s SSO service. The RelayState parameter containing the encoded URL of the MyApp application that the user is trying to reach is also embedded in the SSO URL. This RelayState parameter is meant to be an opaque identifier that is passed back without any modification or inspection. MyApp sends a redirect to the user’s browser. The redirect URL includes the encoded SAML authentication request that should be submitted to the partner’s SSO service. The partner decodes the SAML request and extracts the URL for both MyApp’s ACS (Assertion Consumer Service) and the user’s destination URL (RelayState parameter). The partner then authenticates the user. Partners could authenticate users by either asking for valid login credentials or by checking for valid session cookies. The partner generates a SAML response that contains the authenticated user’s username. In accordance with the SAML 2.0 specification, this response is digitally signed with the partner’s public and private DSA/RSA keys. For this implementation, the developer should integrate the SSO Certificate (.crt) validation while developing. The expiry period of the certificate will be different for each provider. The partner encodes the SAML response and the RelayState parameter and returns that information to the user’s browser. The partner provides a mechanism so that the browser can forward that information to MyApp’s ACS. For example, the partner could embed the SAML response and destination URL in a form and provide a button that the user can click to submit the form to MyApp. MyApp’s ACS verifies the SAML response using the partner’s public key. If the response is successfully verified, ACS redirects the user to the destination URL. The user has been redirected to the destination URL and is logged in to MyApp. Have questions? Contact the technology experts at InApp to learn more.
Step-by-Step Neoload Tutorial in Performance Testing
Nowadays, most, software applications are written as web-based applications to be run in an Internet browser. Independent software testing provides key contributions in making sure the user experience and expectations are met to the highest level. The software industry is currently going through a highly competitive phase as Darwin says-“Survival of the fittest”; this is what will be noticed in this industry too. In order to survive the competition, the capabilities and incapabilities of a software application need to be tested. This includes testing for functionality, usability, and compatibility of the application across the environments it is used on. Along with this, a very important aspect is Performance Testing. Performance testing is a type of non-functional testing that is mostly recommended for business-to-business, business-to-customer applications. Performance testing can be categorized into load testing, stress, volume testing, etc. Common questions asked are, Will our application handle the load or, will it fall apart under load? How many users can our application handle, simultaneously? At what point does the server crash? Performance testing may answer the above questions. The cause of performance-related issues varies with the architecture and configuration of the application. Poor software, network configuration, poorly optimized software code, hardware configuration, etc. are some of the common reasons for performance degradation. One of the best and most emerging tools available to identify ‘performance issues’ in the market is NeoLoad. NeoLoad Tutorial NeoLoad was introduced by “Neotys” as a performance-testing solution for web and mobile applications. NeoLoad becomes popular with its simplicity in usage and easiness of analyzing reports. It allows, tracking statistics of the application infrastructures such as OS, database, and networks, along with the usual response time. Recording scenarios and analyzing its result in NeoLoad is just a 3-step process:- Installation 1) Download and install NeoLoad (for Windows) from the Neotys website 1.1) Install the downloaded exe file to your system. Designing Test Scenario 1) Open NeoLoad and create a project. 1.1) Select the “New Project option”. N3 1.2) Enter the project name and click Finish, NeoLoad design UI will appear. The design page contains three sections: Virtual Users– NeoLoad records the scenarios under the virtual user section, for the free version user can create up to 50 virtual users. To know more about virtual users click here. Populations– Populations are a group of virtual users, mainly used for monitoring the application behavior in different ways. Eg: an e-com application can be tested by simulating 60% of users browsing the site, and 40% making transactions under different browsers. To know more about populations click here. Monitors– NeoLoad supports monitoring of OS, Networks, Databases, Web/EJB Tier, etc. Adding and configuring monitoring machines are allowed through the monitor tab. For more details click here. 1.3) Recording with NeoLoad – virtual users can be created automatically by clicking the start recording button. After clicking the ‘OK’ button NeoLoad Container will open along with the selected browser window. Open the application and enter the Container name in the provided text box. In the above example, ‘google.com’ is the test site and the container name given is “Searching NeoLoad”. Based on the actions, the user can change the container name by just renaming the existing name- the rest of the actions will be recorded under the new container name. The reference video of the NeoLoad recording is here. The recorded scenario will be listed under virtual user profile containers as shown below. Users can apply conditions and loops just by dragging them from the actions menu. The selected request can be edited from the right-hand side. Running and Analyzing Results 1) For running the recorded scenario a population should be created from the population tab. Go to populations Click on the ‘+’ button, enter the name, and click OK to save. In our example, we created only one virtual user, so that user scenarios are running by giving 100% population. After creating the population, assign that population to the runtime scenario. The settings required to run the load test are defined under this scenario page. After configuring the scenario page, the load test scenarios can be run by clicking the play button. After running the scenario a report will be generated. The generated report can be exported to PDF, HTML, XML, and Word formats. Select “Tools” from the ‘Test Summary’ page Then select “Generate Reports” from the “Tools” menu Then select the report type Then customize the report’s contents From the output options page, select the output format and click Finish to generate the report. The generated report can be compared with a predefined set of values using SLAs. SLA (Service Layer Agreements): It allows the user to set a baseline for performance statistics. By applying SLA user can compare the values in generated report with a predefined set of values. Neotys provides a wide range of support to their product NeoLoad through their blogs, websites, and communities. Have questions? Contact the performance testing experts at InApp to learn more.
IndexedDB – A Web API for Client-side Storage
What is IndexedDB? IndexedDB is an API for storing significant amounts of structured data in a user’s browser. It helps to do high-performance searches using indexes. The data stored in IndexedDB is persistent and work online and offline. It provides both a synchronous and asynchronous API. In practice, however, all current implementations are asynchronous, and requests will not block the user interface from loading. Like most web storage solutions, IndexedDB follows a same-origin policy. So while you can access stored data within a domain, you cannot access data across different domains. There is some other traditional way to store data in the browser, though broadly used ones are cookies. There are limitations and drawbacks when using cookies that are limited to about 4 KB of data. Cookies are sent along with every HTTP Request, it slows down your application by sending the same data over and over needlessly. Most browsers allow only 20 cookies per site if you try to store more, the oldest cookies are discarded. Because cookies have been used to spy on people’s surfing behavior, security-conscious people and companies turn them off or request to be asked every time whether a cookie should be set. Another broadly used option is Local Storage. local-storage, or more accurately DOM Storage, was designed for smaller amounts of data. It’s essentially string-only key-value storage, with a simplistic synchronous API. We cannot store JavaScript objects directly in local storage. We need to convert the objects into a string to store. So direct querying is not possible in local storage. Unlike cookies and DOM Storage, IndexedDB provides features that enable you to group, iterate, search, and filter JavaScript objects. IndexedDB is a superior solution for offline storage in browsers when we handle a large amount of structured data. But compared to DOM Storage, its API is quite complicated. There are some polyfills and wrappers like local forage and dexie.js to make it simple. local forage is a polyfill that uses IndexedDB in the background, has some fallback mechanism to WebSQL, and then to local storage in browsers when indexedDB is not supported. dexie.js is a wrapper for IndexedDB that allows much faster code development via simple syntax. IndexedDB is a transactional database system, while it is also a javascript object-oriented database where data is stored in the form of javascript objects. Objects are grouped into object stores, and these objects are indexed with a key. You can run basic queries on your database and fetch records by looking up their keys in specific key ranges as we can also store images and files in IndexedDB. Getting Started with IndexedDB API Here we are going to discuss IndexedDB operations with an example that I have uploaded to GitHub. i. Create a Database and Object Store with Indexes In the following example, we are going to create a database and employee object store which holds employee details by their “EmployeeID” attribute. Additionally “name” and “designation” attributes make indexes. “name” attributes are indexed with unique constraints, so it does not allow the same name to repeat (case sensitive). Indexes are used for a lookup table. A connection to the database is opened. If the “inapp” database did not already exist, it is created and an event handler creates the object store and indexes. var request = indexedDB.open(“inapp”); request.onupgradeneeded = function() { // The database did not previously exist, so create object stores and indexes. db = request.result; var store = db.createObjectStore(“employees”, {keyPath: “empid”}); var nameIndex = store.createIndex(“by_name”, “name”, {unique: true}); var designationIndex = store.createIndex(“by_designation”, “designation”); // Populate with initial data. store.put({name: “Mohammed Safeer”, designation: “Software Engineer”, empid: “1”}); store.put({name: “Damodaran”, designation: “System Analyst”, empid: “2”}); store.put({name: “Ratheesh Kumar”, designation: “Software Engineer”, empid: “3”}); }; ii. Add data to Object Store The following example populates the database using a transaction. var tx = db.transaction(“employees”, “readwrite”); var store = tx.objectStore(“employees”); var request = store.put({empid: “4”, name: “John”, designation: “Business Analyst”}); request.onsuccess = function(){ // data added successfully } request.onerror = function() { // The uniqueness constraint of the “by_name” index failed. console.log(request.error); // Could call request.preventDefault() to prevent the transaction from aborting. }; tx.onabort = function() { // Otherwise the transaction will automatically abort due the failed request. console.log(tx.error); }; iii. Update data to Object Store The following example updates the entry with employee id 4 using a transaction. The update is the same as Insert, here we use an existing Key Path value (here empid 4 in this example). var tx = db.transaction(“employees”, “readwrite”); var store = tx.objectStore(“employees”); var request = store.put({empid: “4”, name: “James”, designation: “Marketing Manager”}); iv. Search Object Store with index and cursor The following example looks up all employee in the database by name using an index and a cursor. Note that it is case sensitive. var tx = db.transaction(“employees”, “readonly”); var store = tx.objectStore(“employees”); var index = store.index(“by_name”); var request = index.openCursor(IDBKeyRange.only(“John”)); request.onsuccess = function(e) { var cursor = e.target.result if (cursor) { // Called for each matching record. cursor.continue(); } else { // No more matching records. } }; v. Retrieve whole employees in Object Store The following example lists all the employees in the employee objectstore var tx = db.transaction(“employees”, “readonly”); var store = tx.objectStore(“employees”); // Get everything in the store var keyRange = IDBKeyRange.lowerBound(0); var request = store.openCursor(keyRange); // This fires once per row in the store. So, for simplicity, // collect the data in an array (data), and pass it in the // callback in one go. var data = []; request.onsuccess = function(e) { var result = e.target.result; // If there’s data, add it to array if (result) { data.push(result.value); result.continue(); // Reach the end of the data } else { callback(data); } }; vi. Delete an entry from Object Store with Key Path In the following example, we delete an entry with empid (Key Path) value 4 var tx = db.transaction(“employees”, “readwrite”); var store = tx.objectStore(“employees”); var request = store.delete(“4”); request.onsuccess = function() { // do something }; vii. Clear Object Store The following example
Rapid Application Development using Visual Studio LightSwitch
Visual Studio LightSwitch is a Microsoft development environment and application framework for quickly building data-centric applications. It is the simplest way to create business applications for the desktop and the cloud. It provides a rich three-tier application infrastructure that lets the developer focus on the custom business logic and data design, minimizing the amount of code required. With LightSwitch it is easy to create data-centric business applications that can consume a variety of data sources and create clients that can run on a variety of devices. Using LightSwitch you can: Build HTML5-based apps that run on all modern devices Consume and aggregate multiple data sources like databases, SharePoint and OData Eliminate plumbing code and focus on what makes your application unique Have flexible deployment and cloud hosting options including Azure and Office 365 Trust that the solution is built on best-of-breed technologies and practices Visual Studio LightSwitch includes a lot of pre-built components for the most common business application tasks. LightSwitch applications are flexible enough to support extensions for templates, data sources, shells, themes, business data types, and custom controls. LightSwitch apps can be hosted on Microsoft Azure or on IIS. SharePoint-enabled LightSwitch apps, also known as Cloud Business Apps, are to be hosted on SharePoint for Office 365. LightSwitch is built on Silverlight which makes it easy to deploy the final application either to the desktop or to a webserver to run in a browser. The application loses a bit of functionality when running in the browser since it runs in the Silverlight sandbox and can’t access things like COM automation or get unlimited access to the local file system. Apart from those limitations, there is currently no easier or quicker way to quickly build a browser-based Silverlight application. One can write custom code in Visual Basic .NET or C#. It can also be deployed to the desktop, browser, or cloud to share your application with others more easily without the cumbersome installation processes. Have questions? Contact the technology experts at InApp to learn more.
Creating Games with Unity 3D
Unity is one of the best development platforms for creating multi-platform 3D and 2D games. It is a game development ecosystem that allows you to create amazing games with very little effort. You can deploy it on multiple platforms such as iOS, Android, Xbox 360, PlayStation3, and many others. Typically Unity 3D comes with a demo so you can play around with all the tools. Features that make Unity 3D special: Multiplatform development with efficient performance optimization where you build the content once and deploy it anywhere. A highly customizable solution with scripting in quick compilation time. Flexible editor with rich features allowing users to produce high-end content. A rich Asset store with thousands of ready-to-use free or for-purchase assets that suit your needs. Unity 3D has the Scene Window where you can actually create the game. The Hierarchy Window organizes all the different game objects that are within your scene. The Project Window has all of the assets available to you that you can drag and drop into your hierarchy. The Inspector Window is where you can manage the components and properties of those game objects. All these features combined together make gaming with Unity 3D a seemingly effortless experience. Benefits of Unity 3D gaming engine: The engine is supported by a large community, as a result, you will be able to find help with any type of scenario. The community version in itself has more features than what is required by the developers and designers. Unity 3D can be developed on Windows or a Macintosh and released on multiple platforms. Unity Pro is available for free so you can try it out before investing time and money into it. Unity comes with a C# compiler which lets you do the scripting/programming of your game. The Games & Infotainment team at InApp has developed ‘Pooooy’ and ‘AeroBike’ 3D games using Unity 3D. Again, it is the ease of using the Unity 3D platform that has enabled our engineers to create such interactive games that take our gaming abilities to a high. To learn Unity 5 refer to the tutorial. Have questions? Contact the technology experts at InApp to learn more.
Useful tips in Selenium WebDriver
The integration of WebDriver API has been a major change in Selenium in terms of browser automation. WebDriver has a well-designed object-oriented API that provides a simpler and more concise programming interface. Along with Selenium, WebDrivers can make direct calls to the browsers by directly using the browser’s built-in support for automation. The following figure shows the Selenium Web server as an intermediary that interacts with the script (in Python / PHP) and the browser (Chrome / IE / Safari / Firefox). Here are some useful tips on using Selenium WebDriver 1. Open different browsers in the web driver a. Firefox Driver WebDriver webDriver= new FirefoxDriver(); b. Chrome Driver WebDriver webDriver= new ChromeDriver(); c. Internet Explorer Driver WebDriver webDriver= new InternetExplorerDriver(); d. Safari Driver WebDriver webDriver= new SafariDriver(); 2. Open new Tab webDriver.findElement(By.cssSelector(“body”)).sendKeys(Keys.CONTROL +”t”); 3. Close the newly opened tab webDriver.findElement(By.cssSelector(“body”)).sendKeys(Keys.CONTROL +”w”); 4. Wait for an element to be available on the page a. Method one WebDriverWait wait = new WebDriverWait(driver, 30); WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(‘xpath-of-element’))); b. Method two List<WebElement> sElements = webDriver.findElements(By.xpath(xPath)); int sCount = 0; while (sCount < sTime) { if (sElements.size() > 0) { break; } else { Thread.sleep(1000); sCount = sCount + 1; sElements = webDriver.findElements(By.xpath(xPath)); } 5. Drag and Drop items Actions builder = new Actions(driver); Action dragAndDrop = builder.clickAndHold(someElement) .moveToElement(otherElement) .release(otherElement) .build(); dragAndDrop.perform(); 6. Execute Java Script statement JavascriptExecutor jsx = (JavascriptExecutor) driver; jsx.executeScript(“sample code”); 7. Enable elements that will be visible or enabled only on mouse over ${iid}= webDriver.findElement(By.id(“id123″)).getAttribute(attributevalue); Execute Javascriptvar innerDiv = document.querySelector(‘DOM- element#${iid}’);innerDiv.style.display=”block”; DOM-element can be div or input or li 8. Upload a file – We can do it in 2 methods a. Method1 – If the upload button is defined as DOM element – ‘input’ use following method WebElement w = getWebDriver().findElement(By.xpath(element-xpath)); w.sendKeys(path-of-file); b. Method2 – If the upload button is not defined as – ‘input’ String filePath = “path-of-file-for-upload”; JavascriptExecutor jsx = (JavascriptExecutor) driver; jsx.executeScript(“document.getElementById(‘fileName’).value=’” + filePath + “‘;”); 9. Switch between frames WebElement iframe = getWebDriver().findElement(By.xpath(“//iframe xpath”)); getWebDriver().switchTo().frame(iframe); 10. Switch back to default content from the frame After performing actions in the iframe that was switched we might switch back to default content to perform further activities getWebDriver().switchTo().defaultContent(); 11. Switch to new window for (String winHandle : webDriver.getWindowHandles()) { webDriver.switchTo().window(winHandle); } 12. Switch tab String oldTab = webDriver.getWindowHandle(); ArrayList<String> newTab = new ArrayList<String>( webDriver.getWindowHandles()); webDriver.switchTo().window(newTab.get(0)); 13. Wait for page load webDriver.manage().timeouts().pageLoadTimeout(100, TimeUnit.SECONDS); 14. Scroll window to bottom, to view elements webDriver = getCurrentWebDriver(); JavascriptExecutor jsx = (JavascriptExecutor) webDriver; jsx.executeScript(“window.scrollTo(0, document.body.scrollHeight);”); 15. Scroll window to specific height -scrollHeight is the value passed to function webDriver = getCurrentWebDriver(); JavascriptExecutor jsx = (JavascriptExecutor) webDriver; jsx.executeScript(“window.scrollTo(0, ” + scrollHeight + “);”); Have questions? Contact the software testing experts at InApp to learn more.
Open Source Tools for Test Management
The test case is a set of test inputs, execution conditions, and expected results developed for a particular objective such as to exercise a particular program path or to verify compliance with a specific requirement. In software testing, we might deal with either actual requirements or self-imposed requirements, no matter how well the formal requirements and specifications are defined. The software tester will develop and execute test cases in the course of testing the software product. Many companies are outsourcing the execution of test procedures, and as a result, we are seeing more and more people for whom test cases are about execution not planning. The following figure depicts a test case cycle. Some of the most popular Open Source test management tools are: 1. Test Environment Toolkit (TETware) The Test Environment Toolkit is a test execution management system that can be used to test products across multiple operating systems. It provides an easy-to-use framework that can be built to support local testing, remote testing, distributed testing, and testing on real-time and embedded systems. 2. Bugzilla Testopia Bugzilla Testopia is a web-based test case management system designed to be a generic tool for tracking test cases on virtually anything in the engineering process and integrating bug reports with test case run results for centralized management of the software engineering process. 3. Mantis MantisBT is a Web-based bug-tracking system to aid product bug tracking. It is written in the PHP scripting language and works with MySQL, MS SQL, and PostgreSQL databases and a web server. MantisBT can be installed on Windows, Linux, Mac OS, OS/2, and others. Almost any web browser should be able to function as a client. Mantis is an easily deployable, web-based bug tracker to aid product bug tracking. It requires PHP, MySQL, and a web server. 4. RTH (Requirements and Testing Hub) RTH is a test-management tool, that has requirements-management and bug-tracking capabilities. It offers a large variety of features designed to manage test cases, releases, test results, issue tracking, and reporting. The tool creates a common repository for all test assets and provides a structured approach to software testing. 5. qaManager qaManager is a platform-independent web-based application for managing software QA projects effectively. qaManager facilitates managing project tracking, resource management, test case management, online library, alerts, and more. It’s powered by OpenXava and has a very simple installation. 6. Litmus (Mozilla) Litmus is an integrated test case management and QA tool maintained by Mozilla. It is designed to improve workflow, visibility, and turnaround time in the Mozilla QA process. Litmus server as a repository for test cases and test results provides a query interface for viewing, reporting, and comparing test results. 7. TestLink TestLink is a web-based test management tool that provides test specifications, test plans and execution, reporting, requirements specification, and collaboration with well-known bug trackers. Both requirements specification and test specification are integrated together which allows users to create test projects and document test cases using this tool. 8. FitNesse FitNesse is an integrated wiki and acceptance testing framework. Wiki facilitates the creation of web pages that are run as tests, so any user can go to that page and see if the tests are passing. It also provides the means to automatically run tests and write acceptance tests. Have questions? Contact the software testing experts at InApp to learn more.