Difference between revisions of "Synthesizing CreditCard Data for LoadTesting"
Jump to navigation
Jump to search
PeterHarding (talk | contribs) |
PeterHarding (talk | contribs) |
||
Line 437: | Line 437: | ||
card_no = cc_list[i] | card_no = cc_list[i] | ||
user = cc_user_map[card_no] | user = cc_user_map[card_no] | ||
emp_no = user.EmpNo | |||
name = user.Name | name = user.Name | ||
name_25 = name.ljust(25) | name_25 = name.ljust(25) |
Latest revision as of 11:09, 23 May 2009
Data Generation
Generate a Valid Credit Card Numbers
#!/usr/bin/env python # # # #------------------------------------------------------------------------------- """ Generate a abitrary collection of pseudo Credit card numbers which satisfy the validation test """ import random #------------------------------------------------------------------------------- prefix = '1234' max_digits = 16 max_numbers = 1000 #------------------------------------------------------------------------------- def gen(prefix): no = prefix l = list(no) i = len(prefix) while (i < (max_digits - 1)): x = random.randint(0, 9) l.append(str(x)) # print i, l, x i += 1 no = ''.join(l) chk_digit = encode(no) delta = 10 - chk_digit if delta == 10: delta = 0 # print chk_digit, delta l.append(str(delta)) no = ''.join(l) return no #------------------------------------------------------------------------------- def encode(no): n = 0 tot = 0 for i in range(len(no)): v = int(no[i]) if i % 2 == 0: inc = v * 2 if v > 4: n += 1 else: inc = v tot += inc tot += n chk = tot % 10 return chk #------------------------------------------------------------------------------- def validate(ccnumber): cnt = 0 tot = 0 for i in range(len(ccnumber)): val = int(ccnumber[i]) if i % 2 == 0: inc = val * 2 if val > 4: cnt += 1 else: inc = val tot += inc tot += cnt if ((tot % 10) == 0): return True else: return False #------------------------------------------------------------------------------- def test(): for no in nos: print no if validate(no): print "Card number VALID" else: print "Card number INVALID" #------------------------------------------------------------------------------- def main(): i = 0 while i < max_numbers: cc_no = gen(prefix) if validate(cc_no): print cc_no else: print "Card number %s - INVALID" % cc_no cc_no = None if cc_no: i += 1 else: pass #------------------------------------------------------------------------------- main()
Synthesizing Credit Card Data
Generate data file for import to Application
Here is a script used to synthetically generate an upload data file for Credit Card data:
#!/usr/bin/env python # #--------------------------------------------------------------------- import os import csv import sys import getopt import random import datetime #--------------------------------------------------------------------- debug_flg = False max_flg = False random_flg = False verbose_flg = False __version__ = '1.0.2' file = None no_days = 1 date = datetime.datetime.today() dates = ['070729', '070730', '070731'] xcodes = [ '1002220', ... '1211220' ] #----- Set up credit card transactiuon type list --------------------- cc_merchants = [] cc_merchants_in = open("cc_merchants.csv", "rb") reader = csv.reader(cc_merchants_in) for row in reader: cc_merchants.append(row) cc_merchants_in.close() # Explicitly close the file *NOW* no_merchants = len(cc_merchants) #----- Set up credit card numbers in cc_no list ---------------------- cc_no = [] cc_in = open("cc_no.txt", "rb") reader = csv.reader(cc_in) for row in reader: cc_no.extend(row) cc_in.close() # Explicitly close the file *NOW* #----- Set up the file header and footer ----------------------------- header = """\ 01,xxx,xxx,%s,2004,1,,,2/ 02,,xxx,1,%s,,AUD,2/ """ footer = """\ ... """ #----- Set up the body of the file ----------------------------------- max_no_tx = 10 # Number of transactions per CC cost = 1000 # Cost of the transaction tx_id = 0 # Number that appears in transaction description def write_data(date): global cost, tx_id file_date = date.strftime("%y%m%d") expense_date = (date - datetime.timedelta(days=1)).strftime("%y%m%d") print "Generating expense data for '%s'" % expense_date out = open(file_date,"w") out.write(header % (file_date, expense_date)) for i in range(len(cc_no)): if random_flg: no_tx = random.randint(0, max_no_tx) elif max_flg: no_tx = 5 else: no_tx = 1 tx_cnt = 0 total = 0.0 expense_lines = '' while tx_cnt < no_tx: cost = random.weibullvariate(alpha=3.0,beta=1) * 2000.0 type = cc_merchants[random.randint(0, no_merchants-1)] expense_lines += "16,699,%.0f,,%s,,%s\n" % (cost, type[0], type[1]) total += cost tx_cnt += 1 tx_id += 1 cost += 5 expense_block = "01,%s,,...,%03.0f,%d,,...,,/\n" % (cc_no[i], total, tx_cnt) expense_block += expense_lines expense_block += "99,...,%d/\n" % (tx_cnt + 2) out.write(expense_block) out.write(footer) out.close() #------------------------------------------------------------------------------- USAGE = """\ Usage: $ ./gen_user_data.py [-d] [-v] [-f <filename>] """ def usage(): sys.stderr.write(USAGE) #------------------------------------------------------------------------------- def main(argv): global debug_flg global max_flg global random_flg global verbose_flg global file, date, no_days #----- Process command line arguments ---------------------------- try: opts, args = getopt.getopt(argv, "dD:f:hmn:rv", ["date", "debug", "file=", "help", "max", "no_days", "random", "verbose"]) except getopt.GetoptError: usage() sys.exit(2) else: for opt, arg in opts: if opt in ("-d", "--debug"): debug_flg = True elif opt in ("-D", "--date"): target_date = arg date = datetime.datetime.strptime(target_date, "%Y%m%d") print date elif opt in ("-f", "--file"): logfile = arg elif opt in ("-h", "--help"): usage() sys.exit(0) elif opt in ("-m", "--max"): max_flg = True elif opt in ("-n", "--no_days"): no_days = int(arg) elif opt in ("-r", "--random"): random_flg = True elif opt in ("-v", "--verbose"): verbose_flg = True dates = [] for n in range(no_days): d = date - datetime.timedelta(days=n) print d.strftime("%y%m%d") dates.append(d) # print date.strftime("%y%m%d") for d in dates: write_data(d) #------------------------------------------------------------------------------- if __name__ == "__main__": main(sys.argv[1:]) #-------------------------------------------------------------------------------
Synthesizing AMEX Credit Card Data
Generates AMEX data file for import to SAP
#!/usr/bin/env python #------------------------------------------------------------------------ import csv import sys import getopt import random #----- Define globals --------------------------------------------------- debug_flg = False verbose_flg = False max_no_tx = 3 # Number of transactions to be created per CC users = [] cc_user_map = {} #----- Setup header, footer and body format strings --------------------- header = """\ ... """ body_1 = """ ... """ body_2 = """\ ... """ #===== Define classes =================================================== class User: pass def __init__(self, csv): self.UserId = csv[0] self.APS = csv[0] self.CostCenter = csv[1] self.CreditCardNumber = csv[2] self.Name = 'tester' #===== Define functions ================================================= #----- Read in user data and set up credit card numbers in cc_no list --- def read_user_data(): users_in = open("users.dat", "rb") reader = csv.reader(users_in) for row in reader: user = User(row) users.append(user) cc_user_map[user.CreditCardNumber] = user users_in.close() #----- Now create a sorted list of keys to the cc catalog --------------- def gen_cc_list(): global cc_list cc_list = cc_user_map.keys() cc_list.sort() # cc_list is *NOW* a sorted list of credit card numbers. #----- Write the file ----------------------------------------------------------- def generate_data(): line_cnt = 3 # Counts the number of lines in the file tx_id = 0 # CC Transaction ID gen_cnt = 0 # No of cards for which data was generated body_cnt = 0 # No of card entries generated total_cost = 0.0 # Total costs generated no_cards = len(cc_list) sift = open("XXXXXX.SFT","w") sift.write(header) for i in range(no_cards): card_no = cc_list[i] user = cc_user_map[card_no] emp_no = user.EmpNo name = user.Name name_25 = name.ljust(25) name_26 = name.ljust(26) no_tx = random.randint(0, max_no_tx) if no_tx > 0: if debug_flg: print card_no gen_cnt += 1 tx_idx = 0 while tx_idx < no_tx: cost = random.weibullvariate(alpha=3.0,beta=1) * 20.0 description = "Description for transaction %05d".ljust(167) % tx_id total_cost += cost sift.write(body_1 %(card_no, name, aps, cost, cost, random.choice(["060901", "060831"]), description)) line_cnt += 1 tx_idx += 1 tx_id += 1 body_cnt += 1 sift.write(body_2 %(card_no, name_25, aps)) line_cnt +=1 line_cnt +=2 sift.write(footer % line_cnt) sift.close() print "Generated %d cc entries for %d cards with total cost of $%8.2f" % (body_cnt, gen_cnt, total_cost) #------------------------------------------------------------------------ def process(): read_user_data() gen_cc_list() generate_data() #------------------------------------------------------------------------ Usage = """ Usage: AMEX_file.py [--help] [--logfile=<filename>] [--date=<DATE>] [--verbose] Generates AMEX data file for import to SAP" e.g: $ ./AMEX__file.py """ def usage(): print >> sys.stderr, Usage #------------------------------------------------------------------------ def main(argv): global debug_flg global verbose_flg global logfile global target_date try: opts, args = getopt.getopt(argv, "dhl:u:t", ["date=", "debug", "help", "logfile=", "verbose"]) except getopt.GetoptError: usage() sys.exit(2) else: for opt, arg in opts: if opt in ("-d", "--debug"): debug_flg = True elif opt in ("-D", "--date"): target_date = arg elif opt in ("-h", "--help"): usage() sys.exit(0) elif opt in ("-l", "--logfile"): logfile = arg elif opt in ("-v", "--verbose"): verbose_flg = True process() #------------------------------------------------------------------------ if __name__ == "__main__": main(sys.argv[1:]) #------------------------------------------------------------------------ # # #------------------------------------------------------------------------
Quick and Dirty Script to Generate Transaction Data
An early and very simple version of the script...
#!/usr/bin/env python EMAIL = "xxx@performiq.com.au" fmt = """\ ... """ #--------------------------------------------------------------------- def gen_data(day): print "Generating data for date - %s" % day ofd = open("%s.txt" % day, "w+") ofd.write(fmt % (day, )) ofd.close() #--------------------------------------------------------------------- dates = ['070612', '070613', '070614', '070615'] for day in dates: gen_data(day) #---------------------------------------------------------------------