我认为以前的答案并没有太大帮助。如果您在测试数据中选择“day”作为 1-31 之间的数字,选择“month”作为 1-12 中的任何数字,那么您的生产代码必须在某处引发异常 - 不应接受 2013 年 2 月 31 日!
因此,您应该创建随机但有效的日期,然后使用任意选择的格式字符串从它们创建字符串。这就是我的代码的作用:
import datetime
import time
import random
separators = ["/",",","-"," "]
prefixes = [""," "]
def random_datetime(min_date, max_date):
since_epoch_min = time.mktime(min_date.timetuple())
since_epoch_max = time.mktime(max_date.timetuple())
random_time = random.randint(since_epoch_min, since_epoch_max)
return datetime.datetime.fromtimestamp(random_time)
def random_date_string_with_random_separators(dt):
prefix = random.choice(prefixes)
sep1 = random.choice(separators)
sep2 = random.choice(separators)
format_string = "{}%m{}%d{}%Y".format(prefix, sep1, sep2)
return dt.strftime(format_string)
min_date = datetime.datetime(2012,01,01)
max_date = datetime.datetime(2013,01,01)
for i in range(10):
print random_date_string_with_random_separators(
random_datetime(min_date, max_date)
)
这应该涵盖所有情况(如果您采用十个以上的值)。
不过,我有两点意见:
不要使用随机数据作为测试输入
您永远不会知道有一天您的测试是否会失败,也许您没有发现生成的数据的所有可能问题。在您的情况下应该没问题,但通常这不是一个好习惯(如果您有其他选择)。或者,您可以创建一套经过深思熟虑的硬编码输入字符串,您可以在其中涵盖所有极端情况。如果有一天你的测试失败了,你知道这不是随机效应。
使用经过良好测试的代码
对于您描述的任务,有一个库!使用dateutil
. 他们有一个很棒的日期时间解析器,几乎可以吞下你扔给它的所有东西。例子:
from dateutil import parser
for i in range(10):
date_string = random_date_string_with_random_separators(
random_datetime(min_date, max_date)
)
parsed_datetime = parser.parse(date_string)
print date_string, parsed_datetime.strftime("%m/%d/%Y")
输出:
01 05,2012 01/05/2012
05 17-2012 05/17/2012
06-07-2012 06/07/2012
10 31,2012 10/31/2012
10/04,2012 10/04/2012
11 16,2012 11/16/2012
03/23 2012 03/23/2012
02-26-2012 02/26/2012
01,12-2012 01/12/2012
12-21 2012 12/21/2012
然后你可以确定它有效。dateutil
有大量的单元测试并且“会工作”。您可以编写的最好的代码是您不必测试的代码。