Search code examples
pythonunit-testingpysparkpython-unittestargs

Passing args as part of unittests to test pyspark script


I have a python script which currently takes a command line argument 'path to the json file' and carries out some cleaning up on the data.

I am writing some unit tests where I am trying to pass path to the json file as an arg. It currently comes up with an error when no arg is passed but when it is passed i get the error:

AttributeError: 'module' object has no attribute 'data' which is data.json. 

I want to have three separate unit tests each having a different json file to be passed as an argument.

My code is as follows:

import unittest
import sys
import argparse

class TestTransform(unittest.TestCase):
    def test_transform(self,input_filename):
        target = __import__("cleaning.py")
        transform = target
        transform.ARGS(input_filename)
        self.assertTrue('Pass')

if __name__ == '__main__':
    unittest.main()

Solution

  • If I understood your problem correctly here is what I normally do in this case. I override the setUpClass method and make all the inputs to this class attributes that can be accessed by the tests:

    class TestTransform():
    
        @classmethod
        def setUpClass(self, file_name):
            self.input_filename = file_name
            #Some other initialization code here
    
        def test_transform(self):
            target = __import__("cleaning.py")
            transform = target
            transform.ARGS(self.input_filename)
            self.assertTrue('Pass')
    

    If you then want to make different tests with different input values you can create other classes by subclassing the TestTransform class (and of course the unittest.TestCase):

    class Test1(TestTransform, unittest.TestCase):
        @classmethod
        def setUpClass(self):
            input_filename = 'MyFileName'
            #Here call the setUpClass from the TestTransform class
            TestTransform.setUpClass(input_filename)