ThomasDelteil commented on a change in pull request #10495: [MXNET-307] Add 
tutorials to the CI + Fix them
URL: https://github.com/apache/incubator-mxnet/pull/10495#discussion_r180914315
 
 

 ##########
 File path: tests/nightly/test_tutorial.py
 ##########
 @@ -25,87 +25,116 @@
 import os
 import warnings
 import imp
-
+import shutil
+import time
+import argparse
 import traceback
 import nbformat
 from nbconvert.preprocessors import ExecutePreprocessor
+import sys
 
 fail_dict = {}
+TIME_OUT = 1800
 
-def test_tutorial(file_path):
-    """Run tutorial python script and  save any error or warning.
-       If no error or warning occurs, run notebook.
-
-    Parameters
-    ----------
-    file_path : str
-        path of tutorial markdown file
-    """
-    with warnings.catch_warnings(record=True) as w:
-        tutorial_name = os.path.basename(file_path)
-        print file_path + '.py'
-        try:
-            imp.load_source('tutorial', file_path + '.py')
-            if len(w) > 0:
-                err_msg = "%s.py has %d warnings.\n" % (tutorial_name, len(w))
-                fail_dict[tutorial_name] = err_msg
-            else:
-                test_tutorial_nb(file_path)
-        except Exception:
-            err_msg = "%s.py has error:\n%s" % (tutorial_name, 
traceback.format_exc())
-            fail_dict[tutorial_name] = err_msg
-
-def test_tutorial_nb(file_path):
+def test_tutorial_nb(file_path, workingdir, kernel=None):
     """Run tutorial jupyter notebook to catch any execution error.
 
     Parameters
     ----------
     file_path : str
-        path of tutorial markdown file
+        path of tutorial .ipynb file
+    workingdir: str
+        path of the directory to run the tutorial in
+    kernel: str
+        Default None
+        name of the kernel to use, if none, will use first kernel 
+        in the list
     """
     tutorial_name = os.path.basename(file_path)
+    sys.stdout.write('Testing {}...'.format(file_path))
+    sys.stdout.flush()
+    tick = time.time()
     notebook = nbformat.read(file_path + '.ipynb', as_version=4)
-    eprocessor = ExecutePreprocessor(timeout=1800)
+    if kernel:
+        eprocessor = ExecutePreprocessor(timeout=TIME_OUT, kernel_name=kernel)
+    else:
+        eprocessor = ExecutePreprocessor(timeout=TIME_OUT)
+    success = True
     try:
-        eprocessor.preprocess(notebook, {'metadata': {}})
+        os.environ['MXNET_STORAGE_FALLBACK_LOG_VERBOSE'] = '0'
+        os.environ['MXNET_CUDNN_AUTOTUNE_DEFAULT'] = '0'
+        eprocessor.preprocess(notebook, {'metadata': {'path':workingdir}})
     except Exception as err:
         err_msg = str(err)
         fail_dict[tutorial_name] = err_msg
+        success = False
     finally:
-        output_nb = open("output.txt", mode='w')
+        output_file = os.path.join(workingdir, "output.txt")
+        output_nb = open(output_file, mode='w')
         nbformat.write(notebook, output_nb)
         output_nb.close()
-        output_nb = open("output.txt", mode='r')
+        output_nb = open(output_file, mode='r')
         for line in output_nb:
             if "Warning:" in line:
-                fail_dict[tutorial_name] = "%s has warning." % (tutorial_name)
-                return
+                success = False
+                if tutorial_name in fail_dict:
+                    fail_dict[tutorial_name] += "\n"+line
+                else:
+                    fail_dict[tutorial_name] = "Warning:\n"+line
+        sys.stdout.write(' Elapsed time: {0:.2f}s '.format(time.time()-tick  ))
+        sys.stdout.write(' [{}] \n'.format('Success' if success else 'Failed'))
+        sys.stdout.flush()
 
 
 if __name__ == "__main__":
-    tutorial_dir = '../../docs/_build/html/tutorials/'
-    with open('test_tutorial_config.txt') as config_file:
-        tutorial_list = []
-        for line in config_file:
-            tutorial_list.append(line.lstrip().rstrip())
-            file_dir = tutorial_dir + line.lstrip().rstrip()
-            test_tutorial_nb(file_dir)
+    tutorial_dir = os.path.join('..','..','docs', '_build', 'html', 
'tutorials')
+    tick = time.time()
+    
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--tutorial", help="tutorial to test, if not set, read 
from test_tutorial_config.txt")
+    parser.add_argument("--kernel", help="name of the jupyter kernel to use 
for the test")
+    parser.add_argument("--no-cache", help="clean the temp directory", 
action="store_true", dest="no_cache")
+    args = parser.parse_args()
+    
+
+    tutorial_list = []
+    if args.tutorial:
+        tutorial_list.append(args.tutorial)
+    else:
+        with open('test_tutorial_config.txt') as config_file:
+            for line in config_file:
+                tutorial_list.append(line.lstrip().rstrip())
+    
+    temp_dir = 'tmp_notebook'
+    if args.no_cache:
+        print("Cleaning and setting up temp directory '{}'".format(temp_dir))
+        shutil.rmtree(temp_dir, ignore_errors=True)
+    
+    kernel = args.kernel if args.kernel else None
+    
+    for tutorial in tutorial_list:
+        file_dir = os.path.join(*([tutorial_dir]+tutorial.split('/')))
+        working_dir = os.path.join(*([temp_dir]+tutorial.split('/')))
+        if not os.path.isdir(working_dir):
+            os.makedirs(working_dir)
+        test_tutorial_nb(file_dir, working_dir, kernel)
 
-        fail_num = len(fail_dict)
-        success_num = len(tutorial_list) - fail_num
-        print "Test Summary Start"
-        print "%d tutorials tested:" % (len(tutorial_list))
-        for tutorial in tutorial_list:
-            print tutorial
-        print "\n%d tests failed:" % (fail_num)
-        for tutorial, msg in fail_dict.items():
-            print tutorial + ":"
-            print msg
-        print "Test Summary End"
-        print "Stats start"
-        print "[Passed: %d of %d]" % (success_num, len(tutorial_list))
-        print "Stats end"
+    fail_num = len(fail_dict)
 
 Review comment:
   it is declared at the top of the file, and written to here: 
   
   ```
   +                if tutorial_name in fail_dict:
   +                    fail_dict[tutorial_name] += "\n"+line
   +                else:
   +                    fail_dict[tutorial_name] = "Warning:\n"+line
   ```

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to