QC/QA/Software Testing Training Videos Free

I've listed some useful videos that would be beneficial for  beginners or some one who wants to understand software testing from scratch. These are free and best  videos that I found on YouTube.

You can watch these in sequence. The first three videos discusses the fundamental and the 4th and 5th playlist has the information in depth.

1) Open Lecture by James Bach on Software Testing




3) Software Testing Tutorial for beginners


4) Manual Testing Tutorials: 34+ videos


5)Software Testing Videos: 9+ videos

Maven use local jar without installing

You can install a local jar by using  mvn install:install-file command/goal as I discussed in my earlier blog post. This ensures the re-usability of jar file across your projects but as a drawback, this requires every team member and build server to run the same command/goal to build their project.

To avoid to the manual hassle, you can add the .jar in pom.xml file without running the mvn install:install-file goal. The idea is to refer a .jar from your project base directory using the <systemPath> element.

In example below, I put my jar files to /myjars directory and point to the jar file as
        <systemPath>${project.basedir}/myjars/[Jar file name]</systemPath>

Directory Structure




For web project (war files )

If you are working on a web project, the above configuration won't add the jars to war file by default. You need to do following.

Here we are asking maven-war-plugin to add all jar ( **/*.jar) from  ${project.basedir}/myjars  to WEB-INF/lib folder when creating the war file.


MySql get full name from last first mid name

Using CONCAT_WS to extract full name from first , middle and last name. 

It also handles the case that the mid_name can be empty or null or even have multiple spaces!

SELECT id, email,
    CASE WHEN mid_name IS NULL OR TRIM(mid_name) ='' THEN
        CONCAT_WS( " ", first_name, last_name )
        CONCAT_WS( " ", first_name, mid_name, last_name )
    END AS full_name

JPA EntityManager get Session Object in Hibernate

How to get Session object from JPA EntityManager

With Hibernate (JPA 2.0 implementation), you would do:


//1. Inject/Autowire Entity Manager
private EntityManager entityManager;    //javax.persistence.EntityManager 

//2. Get Session Object 
Session session = entityManager.unwrap(Session.class);  //org.hibernate.Session

How browserSync actually works ?

How BrowserSync actually works ?

BrowserSync starts a small Node.js server which injects a script ( as below) into the webpage that it's monitoring.The script makes use of WebSockets to communicate between server and client to watch for changes to the code or browser actions. As soon as BrowserSync detects an action ( either in one browser or a server code) it performs a page reload.

<script id="__bs_script__">

    document.write("<script async src='/browser-sync/browser-sync-client.2.11.2.js'> <\/script>".replace("HOST", location.hostname));

If you’re already using a local web server or need to connect to a live website, you can start BrowserSync as a proxy server. See how to do this.

Articles related to BrowserSync /Grunt configuration:

BrowserSync local server proxy configuration

Integrate BrowserSync - with existing local server :

In this example, I will show how we can configure BrowserSync - Grunt task with you existing existing webapp that is running on a local server.

If you want to know the details on
  • how to configure the BrowserSync and Watch tasks  on Grunt, Please visit my previous post :

The configuration is simple : You just need to let the browserSync to know URL of your local server.

options: {
         proxy: "local.server-URL"

The final Gruntfile.js file : (full configuration is already described on my earlier blog  post
BrowserSync Grunt configuration - Multi browswer Live Reload )

module.exports = function(grunt) {
  // Task configuration will go here
   watch: {
   browserSync: {
       bsFiles: {
         src: [
           "css/*.css", "js/.js", "./*.html" //search file/folders
       options: {
         proxy: "local.server-URL" // NEEDS TO BE CONFIGURED
  // Load tasks dependencies
  // Setup default task
  // both browserSync and watch will run when running >grunt command
  grunt.registerTask('default', ['browserSync', 'watch']);


BrowserSync Grunt configuration - Multi browswer Live Reload

How to configure BrowserSync's Live Reload feature with Grunt tasks :

BrowserSync is capable of live reloading and syncing the changes across all your test browsers. This will launch a mini web server by using your current working directory as the base, watch your files for changes & auto-inject those changes into all connected browsers.

See my earlier blog post for the pros/cons of BrowserSync over LiveReload.

In this tutorial, I will demonstrate how to configure the BrowserSync with Grunt tasks "grunt-contrib-watch" and "grunt-browser-sync" in a basic web page setup. You can easily configure your bigger projects on you follow the following steps:

Setup Steps:

The link to github project is given at the end of this article.

1) Web App/Site setup :

I've a basic web site with the following files / directories in my working folder:


BrowserSync vs LiveReload productivity boosters comparison

BrowserSync and LiveReload both are the cool tools that are aimed to improve the development workflow i.e., productivity of front-end development team. In summary, they both reload your browser automatically when you change some css or javascript or HTML - let's say any resource.

The main feature that we get from BrowserSync is : it has capacity of live reloading all your test browsers. It doesn't has constraint to one browser, meaning : it can reflect your code changes on every browser/device/emulator. The new devices/browsers can be added/tested with no additional configurations.


Pros and Cons of BrowserSync with LiveReload:

Pros :
  • Works across multiple devices at the same time
  • Works with all browsers and devices
    • No configuration/plugin needed in each browser
  • Synchronized actions across all browsers
    • form input, page scroll, navigation all gets synchronized across the browsers
  • Works with all browsers and devices
Con :
  • Initial configuration might be a little tricky
    • npm, grunt or gulp etc needs to be configured and the dependencies might give some problems to configure


Configuring Lombok on IntelliJ - Installation of Lombok plugin

How to install/configure Lombok plugin on IntelliJ IDEA :

Steps :

1) Installation 
Using IDE built-in plugin system on Windows:
  • File > Settings > Plugins > Browse repositories... > Search for "lombok" > Install Plugin
Using IDE built-in plugin system on MacOs:
  • Preferences > Settings > Plugins > Browse repositories... > Search for "lombok" > Install Plugin
Manually: 2) Restart IDE.
3) Enable Annotation Processing
 In your project: Click Preferences, "Build, Execution, Deployment", Compiler, Annotation Processors. Click Enable Annotation Processing
Enabling Annotation Processing on IntelliJ IDEA

Optional) IntelliJ and Eclipse compiler
If you're using Eclipse compiler with lombok, try this setup:
  • install plugin (above process)
  • change compiler setting:
  •  > Compiler > Java Compiler > Use Compiler: Eclipse
  •  > Compiler > Annotation Processors > Enable annotation processing: checked (default configuration)
  •  > Compiler > Additional build process VM options: -javaagent:lombok.jar

References :

MongoException$DuplicateKey: E11000 duplicate key error index - @Version

Obviously, we get this exception when we try to update/insert a document(record) with duplicate key field in MongoDB collection(table). There exists several explanation on this:

But, I was getting this error in a different scenario:

1) I already had a model User and data in it. Sample data were being created using mongeez change log file
2) Later, I added a new auditing field @Version to the entity definition.
3) When updating a User record, I got the above exception ( MongoException$DuplicateKey: E11000 duplicate key error index )

User entity :

@Document(collection = "user")
public class User implements Serializable {

    @NotNull    @Size(min = 5, max = 100)
    @Id    private String id;

    @Version    Long version; // THIS WAS ADDED LATER
    @Size(max = 50)
    private String firstName;
    private String lastName;

    private String email;


Solution :

I added a property version and initialized to 1 in all documents

Mongo Change Log  : Using mongeez

    <changeSet changeId="ChangeSet-2" author="gtiwari">
                "_id" : "user1",
                "first_name": "",
                "last_name": "User 1",
                "email": "user1@localhost",
                "version":1  --> I UPDATED ALL user RECORDS'S VERSION = 1 TO SOLVE THIS

Spring MongoDB _id field mapping conventions

Java Spring MongoDB  : '_id' field mapping :

MongoDB requires that you have an '_id' field for all documents. If you don’t provide one the driver will assign a ObjectId with a generated value. The "_id" field can be of any type the, other than arrays.

The following outlines what field will be mapped to the '_id' document field:
  • A field annotated with @Id (org.springframework.data.annotation.Id) will be mapped to the '_id' field.
  • A field without an annotation but named 'id' will be mapped to the '_id' field.
  • The default field name for identifiers is '_id' and can be customized via the @Field annotation.

Examples for the translation of '_id'-field definitions

Field definition Resulting Id-Fieldname in MongoDB
String id
@Field String id
@Field('x') String id
@Id String x
@Field('x') @Id String x

Source :  How the '_id' field is handled in the mapping layer

MongoDB Multiple insert at once

We can insert multiple documents (bulk insert) to a collection using a single insert command :

Syntax :
   db.[COLLECTION].insert( [ { DOC1 }, {DOC2} ] ) ;

Example :
   db.people.insert( [ {name: "Ganesh", age: 24, country : "Nepal"}, {name: "John", age : 20} ]);

In Java  ( Using Spring Data JPA Repository )

   personRepository.insert( personList);
   --> It follows org.springframework.data.mongodb.repository.MongoRepository#insert(Iterable<S> entities) method's syntax

MongoDB rename a database

As of now, there is not a straight forward way to rename a MongoDB database. But you can use the following steps to achieve so :

Here, we are trying to rename OLD_DB to NEW_DB

Steps :
1) copy old database to new one using db.CopyDatabase( OLD_DB, NEW_DB )
2) switching to OLD_DB and dropping the database

Mongo Command :

  #Step 1 : Copy database to new name

  #Step 2 and 3, drop OLD_DB
     use OLD_DB

MongoDB Drop Database

We can use the following query to drop ( DELETE EVERYTHING) from a MongoDB database

( please be careful on running the query, it deletes everything )

   use [database]

MongoDB Like Query

We can do the following to achieve SQL's LIKE equivalent on a Query :

MongoDB :  db.users.find({"name": /jo/})

MYSQL Equivalent:   select * from users where name like '%jo%' 

MongoDB - show all database in server

We can use following commands to view all databases in the server
   show dbs
   show databases

MongoDB - List all collection from selected DB

There are two ways to do so, so far :

1 ) using  reference variable 'db'

2) using show command
    show collections

MongoDB : use database / switch to different database

MongoDB uses same syntax as SQL/MySQL to switch to different database :

MongoDB Syntax :
SQL Syntax :
     use DATABASE_NAME ;

Speech Recognition using HMM and VQ - Code Updates

Hey guys,

I've done some minor changes to the Speech Recognition code that I pushed to github/googlecode couple of years ago. As I received several attention/queries from readers/students all over the world regarding couple of minor bugs within the project, I thought its time ( better late than never :P ) to address them into the code.

Significant changes are on:

- Exception handling
- File handling
- File (recorded WAVE file, VQ codebook, HMM models) save path corrected
- Delta calculation fixed when regression window is less than number of frames ( when a short audio sample is recorded)

I've also uploaded training audio samples for few  words, trained Vector Quantization coebook and trained HMM model file for the words.

If you wish to add/train more words, please use the GUI - "HMM_VQ_Speech_Recognition" class. Just a note, you need to re-train both VQ and HMM for each word that you add.

Code :


Report File (contains both Speech and Speaker recognition)


I hope everyone will benefit from this. Keep coding, keep learning. Please let me know if you see any issues.

Thank you!

Ynaxdh - answer acronym in Yeoman generator

Meaning of Ynaxdh in Yeoman generator

Here the complete list of options/meanings:

  • Y: yes (Default)
  • n: no
  • a: always yes (yes to this question and all others)
  • x: exit
  • d: show the differences between the old and the new file
  • h: help, list all options

Notes :   

  • If you don't remember this definitions you can always enter h and see the list.
  • Also in the new version, when you enter one of the letters you will see the definition showing behind the question so that you can verify your answer before pressing Enter key.
  • The one in uppercase is the default one. If that is your choice, you can just hit enter.