VWO: Reviews, Testimonials and Expert Opinions

All-in-One A/B Testing and Conversion Optimization Platform

VWO is the market-leading A/B testing tool that fast-growing companies use for experimentation & conversion rate optimization. Website.

VWO Overview

VWO Optimization Platform helps to improve key business metrics by empowering to easily discover insights, test ideas, and improve engagement across the entire customer journey. It helps to improve sales and revenue and acquire customers.

VMO enables to optimize the entire audience journey by optimizing both web and messaging experiences, uncovering blockages in the customer journey using VWO insights, gathering, and organizing the insights in the VWO plan, collaborating with the team to convert them into data-backed hypotheses and prioritizing and execute the optimization roadmap through VWO testing.

It helps to continuously improve KPIs including features like conversion growth by rapidly testing tons of new ideas, diagnosing problem areas in the visitors’ experiences, keeping the visitors engaged with automated marketing campaigns through web push notifications, and Facebook Messenger and many more.

Testing PDF content with PHP and Behat

If you have a PDF generation functionality in your app, and since most of the libraries out there build the PDF content in an internal structure before outputting it to the file system (FPDF, TCPDF). A good way to write a test for it is to test the output just before the rendering process.

Recently however, and due to this process being a total pain in the ass, people switched to using tools like wkhtmltopdf or some of its PHP wrappers (phpwkhtmltopdfsnappy) that let you build your pages in html/css and use a browser engine to render the PDF for you, and while this technique is a lot more developer friendly, you loose control over the building process.

So if you’re using one of those tools or just need to test for the existence of some string inside a PDF, here’s how to write a BDD style acceptance test for it using Behat.

Setup framework

Add this your composer.json then run composer install

{
    "minimum-stability": "dev",
    "require": {
        "smalot/pdfparser": "*",
        "behat/behat": "3.*@stable",
        "behat/mink": "1.6.*@stable",
        "phpunit/phpunit": "4.*"
    },
    "config": {
        "bin-dir": "bin/"
    }
}

Initialize Behat

bin/behat --init

This command creates the initial features directory and a blank FeatureContext class.

If everything worked as expected, your project directory should look like this :

├── bin
│   ├── behat -> ../vendor/behat/behat/bin/behat
│   └── phpunit -> ../vendor/phpunit/phpunit/phpunit
├── composer.json
├── composer.lock
├── features
│   └── bootstrap
└── vendor
    ├── autoload.php
    ├── behat
    ├── composer
    ├── doctrine
    ├── phpdocumentor
    ├── phpspec
    ├── phpunit
    ├── sebastian
    ├── smalot
    ├── symfony
    └── tecnick.com

All right, it’s time to create some features, create a new file inside /feature, I’ll name mine pdf.feature

Feature: Pdf export
 
  Scenario: PDF must contain text
    Given I have pdf located at "samples/sample1.pdf"
    When I parse the pdf content
    Then the the page count should be "1"
    Then page "1" should contain
    """
Document title  Calibri : Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    """

Run Behat (I know we didn’t write any testing code yet, just run it, trust me!)

bin/behat

An awesome feature of Behat is it detects any missing steps and provides you with boilerplate code you can use in your FeatureContext. This is the output of the last command:

Feature: Pdf export
 
  Scenario: PDF must contain text                     # features/pdf.feature:3
    Given I have pdf located at "samples/sample1.pdf"
    When I parse the pdf content
    Then the the page count should be "1"
    Then page "1" should contain
      """
      Document title  Calibri : Lorem ipsum dolor sit amet, consectetur adipiscing elit.
      """
 
1 scenario (1 undefined)
4 steps (4 undefined)
0m0.01s (9.28Mb)
 
--- FeatureContext has missing steps. Define them with these snippets:
 
    /**
     * @Given I have pdf located at :arg1
     */
    public function iHavePdfLocatedAt($arg1)
    {
        throw new PendingException();
    }
 
    /**
     * @When I parse the pdf content
     */
    public function iParseThePdfContent()
    {
        throw new PendingException();
    }
 
    /**
     * @Then the the page count should be :arg1
     */
    public function theThePageCountShouldBe($arg1)
    {
        throw new PendingException();
    }
 
    /**
     * @Then page :arg1 should contain
     */
    public function pageShouldContain($arg1, PyStringNode $string)
    {
        throw new PendingException();
    }

Cool right? copy/paste the method definitions to you FeatureContext.php and let’s get to it, step by step :

Step 1

Given I have pdf located at "samples/sample1.pdf"

In this step we only need to make sure the filename we provided is readable then store it in a class property so we can use it in later steps:

 /**
     * @Given I have pdf located at :filename
     */
    public function iHavePdfLocatedAt($filename)
    {
        if (!is_readable($filename)) {
            Throw new \InvalidArgumentException(
                sprintf('The file [%s] is not readable', 
                $filename)
            );
        }
 
        $this->filename = $filename;
    }

Step 2

When I parse the pdf content

The heavy lifting is done here, we need to parse the PDF and store its content and metadata in a usable format:

    /**
     * @When I parse the pdf content
     */
    public function iParseThePdfContent()
    {
        $parser = new Parser();
        $pdf    = $parser->parseFile($this->filename);
        $pages  = $pdf->getPages();
        $this->metadata = $pdf->getDetails();
 
        foreach ($pages as $i => $page) {
            $this->pages[++$i] = $page->getText();
        }
    }

Step 3

Then the the page count should be "1"

Since we already know how many pages the PDF contains, this is a piece of cake, so let’s not reinvent the wheel and use PHPUnit assertions:

 /**
     * @Then the the page count should be :pageCount
     * @param int $pageCount
     */
    public function theThePageCountShouldBe($pageCount)
    {
        PHPUnit_Framework_Assert::assertEquals( 
            (int) $pageCount, 
            $this->metadata['Pages']
        );
    }

Step 4

Then page "1" should contain
    """
Document title  Calibri : Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    """

Same method, we have an array containing all content from all pages, a quick assertion does the trick:

    /**
     * @Then page :pageNum should contain
     * @param int $pageNum
     * @param PyStringNode $string
     */
    public function pageShouldContain($pageNum, PyStringNode $string)
    {
        PHPUnit_Framework_Assert::assertContains(
            (string) $string, 
            $this->pages[$pageNum]
        );
    }

Et voilà! you should have green

Feature: Pdf export
 
  Scenario: PDF must contain text                     # features/pdf.feature:3
    Given I have pdf located at "samples/sample1.pdf" # FeatureContext::iHavePdfLocatedAt()
    When I parse the pdf content                      # FeatureContext::iParseThePdfContent()
    Then the the page count should be "1"             # FeatureContext::theThePageCountShouldBe()
    Then page "1" should contain                      # FeatureContext::pageShouldContain()
      """
      Document title  Calibri : Lorem ipsum dolor sit amet, consectetur adipiscing elit.
      """
 
1 scenario (1 passed)
4 steps (4 passed)

For the purpose of this article, we’re relying on the PDF parser library which has many encoding and white space issues, feel free to use any PHP equivalent or a system tool like xpdf for better results.

If you want to make your test more decoupled (and you should). One way is to create a PDFExtractor interface then implement it for each tool you want to use, that way you can easily swap libraries.

The source code behind this article is provided here, any feedback is most welcome.

Source: matmati.net:80/testing-pdf-with-behat-and-php

How to Find Over 200+ Beta Testers for Free

Beta testing: the rehearsal before showcasing your app to the world. The beta testing phase is a critical one in your app’s life cycle and you need to make the most of it. Finding beta testers is an integral part of this process. You need them to test your app in every possible way to make sure that you weed out all the hidden corner case bugs. But where can you find these beta users and how many of them would be willing to try out your app? We’ll tell you where you can find these users and, lucky for you, there are tons of early adopters out there who would love to try out your app — and for free!

 

 

First, how many beta testers do you need?

 

A very important question that depends on the size and scope of your application. This number largely depends on the number of features and demographic characteristics of the app and its users (Beta Testing Guide). To be on the safe side, you’ll need between 100-300 beta testers to make sure your users go through all the use cases necessary to ensure your app is clean.

 

 

Where can you find these beta testers?

 

We’ve done the hard work for you and compiled a list of sources — use them!

A great way to get feedback on your product is to put it in front of a bunch of people who have already expressed a desired interested in a specific domain. You can leverage various forums and social media as platforms for displaying your product. However, you need to remember you should be a part of their community or else you will be perceived as a spammer or even worse: an advertiser.

 

1. HACKER NEWS

By far the biggest online grouping of tech enthusiasts in the Internet universe is Hacker News. If you’re looking for honest and brutal feedback, you won’t find a better place. This is where the smartest and most influential people in the tech world hang out, so it’s still definitely worth it because if you make it on HN, you’ve basically made it in life. Check out how to craft a successful HN post and don’t ever forget to follow the rules!

 

2. REDDIT

You may not think they have the most enjoyable user interface but they do have a passionate and extremely involved community. Just like HN, Reddit has its own dedicated community and usually welcomes those with karma with an open heart. The good thing about Reddit is that you’ll find a subreddit for literally EVERYTHING so make sure you target the right ones and make your post count. Check out our subreddit suggestions for startups and mobile apps and have a look at the Reddit rules while you’re at it:

 

3. PRODUCT HUNT

You will be hard pressed to find a more engaging platform than Product Hunt with such a passionate following and community. The world’s best and brightest product managers and tech lovers constantly stay up to date with Product Hunt to get a feel of what is going on in the tech world. Making a splash on Product Hunt would bring you a vast number of users who would be eager to use your app.

 

4. BETA DIRECTORIES

Another great way to get your idea out there is sharing it on a beta directory to attract passionate techies and early adopters. The downside is that these users are more curious than loyal and probably won’t be sticking around for too long. Since they’ve signed up to receive all kinds of beta products, they end up not being the most engaged. You’ll still end up with a bunch of beta testers and your SEO will benefit from the links these directories will provide. Here’s a list of the best beta directories you’ll find to get your beta users:

 

5. STARTUP DIRECTORIES

If you’re confident in your product and you’re ready to get even more users, I encourage you to list your startup in any of the popular startup directories that publish frequent reviews on the hottest apps and startups. Tons of early adopters and tech lovers follow and subscribe to these sites, so you’re bound to attract their attention. The best products will always get significant traction and conversions. Here’s a list of the startup directories we think will help you get the most beta users:

 

6. QUORA

Quora is one of those places with a fast-growing community that can have a very positive impact on your app’s success. The catch is that you’ll need to build up your own community by demonstrating expertise in a specific niche. Show your genuine care and passion for your domain by offering your insights on various threads within your niche. This will pay dividends and people will eventually be willing to help you in return with your own app or startup.

 

7. TWITTER

Nobody will be more willing to try out your app more than those who already hate your competitor. Hunt for them, find them, and show them. You will find that unhappy users are your friends.

 

 

Here’s a list of hashtags that could be useful to you:

 

8. HUSTLE

Let’s be real here: No app or startup grows without some true grit and hustle. Leverage social media to attract beta testers to your app. Don’t be afraid to try your own methods and see what works for you. Try Facebook groups, Twitter hashtags relevant to your product, follow relevant Twitter lists, try Pinterest, use your alma matter or high school if that could be useful. Don’t leave any stone unturned.