我一直在努力开始进行单元测试,同时开发一个小的cli程序.
我的程序基本上解析命令行参数和选项,并决定调用哪个函数.每个函数都对数据库执行一些操作.
所以,例如,我可能有一个创建函数:
def create(self,opts,args): #I've left out the error handling. strtime = datetime.datetime.now().strftime("%D %H:%M") vals = (strtime,opts.message,opts.keywords,False) self.execute("insert into mytable values (?,?,?)",vals) self.commit()
我的测试用例应该调用这个函数,然后执行select sql来检查是否输入了行?这听起来很合理,但也使测试更难维护.你会重写函数来返回一些东西并检查返回值吗?
谢谢
解决方法
Alex的答案涵盖了依赖注入方法.另一个是考虑你的方法.目前,它有两个阶段:构造sql语句,并执行sql语句.您不想测试第二阶段:您没有编写sql引擎或数据库,您可以假设它们正常工作.阶段1是您的工作:构建sql语句.因此,您可以重新组织代码,以便只测试阶段1:
def create_sql(self,False) return "insert into mytable values (?,vals def create(self,args): self.execute(*self.create_sql(opts,args)) self.commit()
create_sql函数是阶段1,现在它的表达方式允许您直接针对它编写测试:它接受值并返回值,因此您可以编写涵盖其功能的单元测试.创建函数本身现在更简单,无需进行如此详尽的测试:您可以进行一些测试,证明它确实可以正确执行sql,但您不必覆盖创建中的所有边缘情况.