diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py
index 1aabed473a067dcf0ee667e225e1cebc28a06790..caa26f3b4159117c6f17de76f5db69a082ee1b65 100644
--- a/src/cutecoin/gui/mainwindow.py
+++ b/src/cutecoin/gui/mainwindow.py
@@ -103,6 +103,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         self.open_ucoin_info = lambda: QDesktopServices.openUrl(QUrl("http://ucoin.io/theoretical/"))
         self.homescreen.button_info.clicked.connect(self.open_ucoin_info)
 
+        self.export_dialog = None
+
         # TODO: There are too much refresh() calls on startup
         self.refresh()
 
@@ -350,16 +352,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         dialog.exec_()
 
     def export_account(self):
-        selected_file = QFileDialog.getSaveFileName(self,
-                                                    self.tr("Export an account"),
-                                                    "",
-                                                    self.tr("All account files (*.acc)"))
-        path = ""
-        if selected_file[0][-4:] == ".acc":
-            path = selected_file[0]
-        else:
-            path = selected_file[0] + ".acc"
-        self.app.export_account(path, self.app.current_account)
+        # Testable way off using a QFileDialog
+        self.export_dialog = QFileDialog(self)
+        self.export_dialog.setObjectName('ExportFileDialog')
+        self.export_dialog.setWindowTitle(self.tr("Export an account"))
+        self.export_dialog.setNameFilter(self.tr("All account files (*.acc)"))
+        self.export_dialog.setLabelText(QFileDialog.Accept, self.tr('Export'))
+        self.export_dialog.accepted.connect(self.export_account_accepted)
+        self.export_dialog.show()
+
+    def export_account_accepted(self):
+        selected_file = self.export_dialog.selectedFiles()
+        if selected_file:
+            if selected_file[0][-4:] == ".acc":
+                path = selected_file[0]
+            else:
+                path = selected_file[0] + ".acc"
+            self.app.export_account(path, self.app.current_account)
 
     def closeEvent(self, event):
         if self.app.current_account:
diff --git a/src/cutecoin/tests/__init__.py b/src/cutecoin/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/src/cutecoin/tests/__init__.py
@@ -0,0 +1 @@
+
diff --git a/src/cutecoin/tests/all.py b/src/cutecoin/tests/all.py
new file mode 100644
index 0000000000000000000000000000000000000000..5531ab01fc7b28f8f51a90e8523a692d79df21f3
--- /dev/null
+++ b/src/cutecoin/tests/all.py
@@ -0,0 +1,4 @@
+import unittest
+
+# run all tests
+unittest.TextTestRunner().run(unittest.defaultTestLoader.discover(start_dir='cutecoin.tests', pattern='test_*'))
diff --git a/src/cutecoin/tests/main_window/__init__.py b/src/cutecoin/tests/main_window/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /dev/null
+++ b/src/cutecoin/tests/main_window/__init__.py
@@ -0,0 +1 @@
+
diff --git a/src/cutecoin/tests/main_window/test_main_window_dialogs.py b/src/cutecoin/tests/main_window/test_main_window_dialogs.py
new file mode 100644
index 0000000000000000000000000000000000000000..748ef886a1048eba81adb36f733c94746daf6059
--- /dev/null
+++ b/src/cutecoin/tests/main_window/test_main_window_dialogs.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+
+import sys
+import unittest
+import gc
+import PyQt5
+from PyQt5.QtWidgets import QApplication, QMenu
+from PyQt5.QtCore import QLocale, QTimer
+from cutecoin.gui.mainwindow import MainWindow
+from cutecoin.core.app import Application
+
+# Qapplication cause a core dumped when re-run in setup
+# set it as global var
+qapplication = QApplication(sys.argv)
+
+
+class MainWindowDialogsTest(unittest.TestCase):
+    def setUp(self):
+        QLocale.setDefault(QLocale("en_GB"))
+        self.application = Application(sys.argv)
+        self.main_window = MainWindow(self.application)
+
+    def test_action_about(self):
+        # select menu
+        self.main_window.actionAbout.trigger()
+        widgets = qapplication.topLevelWidgets()
+        for widget in widgets:
+            if isinstance(widget, PyQt5.QtWidgets.QDialog):
+                self.assertEqual(widget.objectName(), 'AboutPopup')
+                self.assertEqual(widget.isVisible(), True)
+                widget.close()
+                break
+
+    def test_action_add_account(self):
+        # asynchronous test, cause dialog is waiting user response
+        QTimer.singleShot(0, self._async_test_action_add_account)
+        # select menu
+        self.main_window.action_add_account.trigger()
+
+    def _async_test_action_add_account(self):
+        widgets = qapplication.topLevelWidgets()
+        for widget in widgets:
+            if isinstance(widget, PyQt5.QtWidgets.QDialog):
+                self.assertEqual(widget.objectName(), 'AccountConfigurationDialog')
+                self.assertEqual(widget.isVisible(), True)
+                widget.close()
+                break
+    #
+    # # fixme: require a app.current_account fixture
+    # # def test_action_configure_account(self):
+    # #     # asynchronous test, cause dialog is waiting user response
+    # #     QTimer.singleShot(0, self._async_test_action_configure_account)
+    # #     # select about menu
+    # #     self.main_window.action_configure_parameters.trigger()
+    # #
+    # # def _async_test_action_configure_account(self):
+    # #     widgets = qapplication.topLevelWidgets()
+    # #     for widget in widgets:
+    # #         if isinstance(widget, PyQt5.QtWidgets.QDialog):
+    # #             self.assertEqual(widget.objectName(), 'AccountConfigurationDialog')
+    # #             self.assertEqual(widget.isVisible(), True)
+    # #             widget.close()
+    # #             break
+    #
+
+    def test_action_export_account(self):
+        # select menu
+        self.main_window.action_export.trigger()
+
+        widgets = qapplication.topLevelWidgets()
+        for widget in widgets:
+            if isinstance(widget, PyQt5.QtWidgets.QFileDialog):
+                self.assertEqual(widget.objectName(), 'ExportFileDialog')
+                self.assertTrue(widget.isVisible())
+                widget.close()
+                break
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/src/cutecoin/tests/MainWindowTest.py b/src/cutecoin/tests/main_window/test_main_window_menus.py
similarity index 79%
rename from src/cutecoin/tests/MainWindowTest.py
rename to src/cutecoin/tests/main_window/test_main_window_menus.py
index deca0f8876dee2725af54c298839b66a475b38c5..0a221eac3ab3431d6eb80abe89dda5aaddd6187e 100644
--- a/src/cutecoin/tests/MainWindowTest.py
+++ b/src/cutecoin/tests/main_window/test_main_window_menus.py
@@ -14,7 +14,7 @@ from cutecoin.core.app import Application
 qapplication = QApplication(sys.argv)
 
 
-class MainWindowTest(unittest.TestCase):
+class MainWindowMenusTest(unittest.TestCase):
     def setUp(self):
         QLocale.setDefault(QLocale("en_GB"))
         self.application = Application(sys.argv)
@@ -64,19 +64,6 @@ class MainWindowTest(unittest.TestCase):
         self.assertEqual(actions[0].objectName(), 'actionTransfer_money')
         self.assertEqual(actions[1].objectName(), 'actionCertification')
 
-    def test_action_about(self):
-        # select about menu
-        self.main_window.actionAbout.trigger()
-        widgets = qapplication.topLevelWidgets()
-        dialog = None
-        for widget in widgets:
-            if isinstance(widget, PyQt5.QtWidgets.QDialog):
-                dialog = widget
-                break
-        self.assertEqual(dialog.objectName(), 'AboutPopup')
-        self.assertEqual(dialog.isVisible(), True)
 
 if __name__ == '__main__':
-    main_window_suite = unittest.TestLoader().loadTestsFromTestCase(MainWindowTest)
-    runner = unittest.TextTestRunner()
-    runner.run(main_window_suite)
+    unittest.main()