I have a program (file1.py) with functions and I want to test these functions from the file test1.py. When I import the first function I don’t know why the terminal tells me that I need to introduce the arguments that are required when I run file1.py. Is beyond my understanding why this happens because as far as I know from test1.py I am taking the first function and not the complete file1.py.
file1.py (until the first function)
import os import argparse import pandas as pd import numpy as np # Enter the path/file names parser = argparse.ArgumentParser() parser.add_argument('--vcf1', type=str, required=True) parser.add_argument('--vcf2', type=str, required=True) args = parser.parse_args() NAME_FILE_1 = args.vcf1 NAME_FILE_2 = args.vcf2 def load_sample (Name_file): ''' Take the header of the body of the CSV file ''' with open(Name_file, 'r') as f: for line in f: if line.startswith('#') and len(line)>2 and line[1] != '#': columns = line[1:-1].split('t') data = pd.read_csv(Name_file, comment='#', delimiter='t', names=columns) break return data # The data of the VCF is here dataA = load_sample (NAME_FILE_1) dataB = load_sample (NAME_FILE_2)
And my test1.py
import os import pandas as pd import numpy as np from VCF_matcher.app.run import load_sample NAME_FILE_1 = "./test_sample.vcf" # FIRST TEST def test_load_sample(): '''Verify all rows of the body of the vcf file is taken''' data_to_test = load_sample (NAME_FILE_1) assert len(data_to_test) == 10425
The output:
======================================================== ERRORS ======================================================== _________________________________________ ERROR collecting test_vcf_matcher.py _________________________________________ test_vcf_matcher.py:13: in <module> from VCF_matcher.app.run import load_sample ../app/run.py:26: in <module> args = parser.parse_args() ../../../opt/anaconda3/lib/python3.8/argparse.py:1768: in parse_args args, argv = self.parse_known_args(args, namespace) ../../../opt/anaconda3/lib/python3.8/argparse.py:1800: in parse_known_args namespace, args = self._parse_known_args(args, namespace) ../../../opt/anaconda3/lib/python3.8/argparse.py:2034: in _parse_known_args self.error(_('the following arguments are required: %s') % ../../../opt/anaconda3/lib/python3.8/argparse.py:2521: in error self.exit(2, _('%(prog)s: error: %(message)sn') % args) ../../../opt/anaconda3/lib/python3.8/argparse.py:2508: in exit _sys.exit(status) E SystemExit: 2 --------------------------------------------------- Captured stderr ---------------------------------------------------- usage: pytest [-h] --vcf1 VCF1 --vcf2 VCF2 pytest: error: the following arguments are required: --vcf1, --vcf2 =============================================== short test summary info ================================================ ERROR test_vcf_matcher.py - SystemExit: 2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Advertisement
Answer
You have to structure file1.py
as follows if you don’t want to run the “main” part every time you import this file from some other Python file:
import os import argparse import pandas as pd import numpy as np def load_sample (Name_file): ''' Take the header of the body of the CSV file ''' with open(Name_file, 'r') as f: for line in f: if line.startswith('#') and len(line)>2 and line[1] != '#': columns = line[1:-1].split('t') data = pd.read_csv(Name_file, comment='#', delimiter='t', names=columns) break return data if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--vcf1', type=str, required=True) parser.add_argument('--vcf2', type=str, required=True) args = parser.parse_args() NAME_FILE_1 = args.vcf1 NAME_FILE_2 = args.vcf2 dataA = load_sample(NAME_FILE_1) dataB = load_sample(NAME_FILE_2)
For a better explanation, see.