diff --git a/fake_run_test.py b/fake_run_test.py
new file mode 100644
index 0000000..7797cfc
--- /dev/null
+++ b/fake_run_test.py
@@ -0,0 +1,107 @@
+import json
+import sys
+
+import run_test
+
+
+logger = run_test.logger
+tool = None
+
+
+class FakeVMContext(object):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def __enter__(self):
+        return ["fake@fake"]
+
+    def __exit__(self, *args, **kwargs):
+        pass
+
+
+def fake_start_vms(*args, **kwargs):
+    return FakeVMContext
+
+
+class FakeFD(object):
+    def __init__(self, content):
+        self.content = content
+        self.channel = FakeChannel()
+
+    def read(self):
+        return self.content
+
+
+class FakeChannel(object):
+    def recv_exit_status(self):
+        return 0
+
+
+def get_fake_out(cmd):
+    empty_fd = FakeFD("")
+    if "pgbench" == tool:
+        if "run" in cmd:
+            out = FakeFD("2 1:43\n2 1:42\n4 2:77")
+        else:
+            out = empty_fd
+    elif "iozone" == tool or "fio" == tool:
+        data = {'__meta__': {
+            'direct_io': 1,
+            'action': 'r',
+            'concurence': 1,
+            'blocksize': 1,
+            'sync': 's'},
+                 'bw_mean': 10}
+        out = FakeFD(json.dumps(data))
+    else:
+        raise Exception("tool not found")
+    err = empty_fd
+    return empty_fd, out, err
+
+
+def fake_ssh_connect(*args, **kwargs):
+    return FakeSSH()
+
+
+class FakeSFTP(object):
+    def put(self, what, where):
+        logger.debug("Called sftp put with %s %s" % (what, where))
+
+    def chmod(self, f, mode):
+        logger.debug("called sftp chmod %s %s" % (mode, f))
+
+    def close(self):
+        logger.debug("called sftp close")
+
+
+class FakeSSH(object):
+    def exec_command(self, cmd, **kwargs):
+        return get_fake_out(cmd)
+
+    def close(self):
+        pass
+
+    def open_sftp(self):
+        return FakeSFTP()
+
+
+class FakePopen(object):
+    def __init__(self, cmd,
+                 shell=True,
+                 stdout=None,
+                 stderr=None,
+                 stdin=None):
+        print "Running subprocess command: %s" % cmd
+        self.stdin, self.stdout, self.stderr = get_fake_out(cmd)
+
+    def wait(self):
+        return 0
+
+
+if __name__ == '__main__':
+    run_test.subprocess.Popen = FakePopen
+    run_test.start_test_vms = fake_start_vms()
+    run_test.ssh_runner.ssh_connect = fake_ssh_connect
+    opts = run_test.parse_args(sys.argv[1:])
+    tool = opts.tool_type
+    exit(run_test.main(sys.argv[1:]))
diff --git a/formatters.py b/formatters.py
index fc3bd4c..2a47649 100644
--- a/formatters.py
+++ b/formatters.py
@@ -62,7 +62,10 @@
             sum_res = sum([r[1] for r in results])
             mean = sum_res/len(results)
             sum_sq = sum([(r[1] - mean) ** 2 for r in results])
-            dev = math.sqrt(sum_sq / (len(results) - 1))
+            if len(results) > 1:
+                dev = math.sqrt(sum_sq / (len(results) - 1))
+            else:
+                dev = 0
             data[key] = (mean, dev)
         return data
 
diff --git a/run_test.py b/run_test.py
index 67dd298..c6f1d81 100644
--- a/run_test.py
+++ b/run_test.py
@@ -29,9 +29,9 @@
 
 
 logger = logging.getLogger("io-perf-tool")
-logger.setLevel(logging.INFO)
+logger.setLevel(logging.DEBUG)
 ch = logging.StreamHandler()
-ch.setLevel(logging.INFO)
+ch.setLevel(logging.DEBUG)
 logger.addHandler(ch)
 
 log_format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
@@ -138,7 +138,7 @@
         description="Run disk io performance test")
 
     parser.add_argument("tool_type", help="test tool type",
-                        choices=['iozone', 'fio', 'pgbench'])
+                        choices=['iozone', 'fio', 'pgbench', 'two_scripts'])
 
     parser.add_argument("-l", dest='extra_logs',
                         action='store_true', default=False,
@@ -150,13 +150,6 @@
     parser.add_argument("-f", "--test-opts-file", dest='opts_file',
                         type=argparse.FileType('r'), default=None,
                         help="file with cmd line options for test")
-    #
-    # parser.add_argument("-t", "--test-directory", help="directory with test",
-    #                     dest="test_directory", required=True)
-
-    parser.add_argument("-t", "--test", help="test to run",
-                        dest="test_directory", required=True,
-                        choices=['io', 'pgbench', 'two_scripts'])
 
     parser.add_argument("--max-preparation-time", default=300,
                         type=int, dest="max_preparation_time")
