这次写的是unittest模块的测试用例,属于自动化的门槛,进去了基本算自动化入了门,测试内容很简单,模拟给url推送用户名、密码测试登录功能
先上代码:
#login_test.py import requests class Login(): def test_login(self,username,password): url = "http://47.107.168.87:8080/futureloan/mvc/api/member/login" user_pwd = {} user_pwd["mobilephone"] = username user_pwd["pwd"] = password result = requests.get(url, params=user_pwd) list = (result.text).split(",") return list[3].split(":")[1].split("}")[0] if __name__ == '__main__': result = Login() Return = result.test_login("18688773461","123456") print(Return)
#test_case.py from login_test import Login import HTMLTestRunner import unittest class Run_Test(unittest.TestCase):#继承unittest.TestCase # def setUp(self): # # 每个测试用例执行之前做操作 # print("用例执行开始") # self.Result = Login() # def tearDown(self): # #每个测试用例执行之后做操作 # print("用例执行结束") def test_run1(self): self.Result = Login() Return = self.Result.test_login(" ","123456") self.assertEqual(eval(Return),"手机号不能为空") #测试用例1 def test_run2(self): self.Result = Login() Return = self.Result.test_login("18688773467"," ") self.assertEqual(eval(Return),"密码不能为空") #测试用例2 def test_run3(self): self.Result = Login() Return = self.Result.test_login("18688773461","123456") self.assertEqual(eval(Return),"用户名或密码错误") #测试用例3 def test_run4(self): self.Result = Login() Return = self.Result.test_login("18688773467","123456") self.assertEqual(eval(Return),"登录成功") #测试用例4 if __name__ == '__main__': unittest.main()
#run_test.py import unittest,HTMLTestRunner import test_case class runtest(): def run_test_1(self): # 创建测试套件 suite = unittest.TestSuite() # 找到目录下所有的以test开头的Python文件里面的测试用例 all_test = unittest.defaultTestLoader.discover('.','test_*.py') # 把所有的测试用例添加进来 for i in all_test: suite.addTests(i) # 打开一个保存结果的html文件 fp = open('res_1.html','wb') # 生成执行用例的对象 runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况') # 执行测试套件 runner.run(suite) def run_test_2(self): # 创建测试套件 suite = unittest.TestSuite() # 测试套件中添加测试用例 loader = unittest.TestLoader() suite.addTests(loader.loadTestsFromTestCase(test_case.Run_Test)) # 打开一个保存结果的html文件 fp = open('res_2.html', 'wb') # 生成执行用例的对象 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='all_tests', description='所有测试情况') # 执行测试套件 runner.run(suite) def run_test_3(self): # 创建测试套件 suite = unittest.TestSuite() # 测试套件中添加测试模块 loader = unittest.TestLoader() suite.addTests(loader.loadTestsFromModule(test_case)) # 打开一个保存结果的html文件 fp = open('res_3.html', 'wb') # 生成执行用例的对象 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='all_tests', description='所有测试情况') # 执行测试套件 runner.run(suite) # runner = unittest.TextTestRunner() # runner.run(suite) if __name__ == '__main__': homework = runtest() homework.run_test_1() homework.run_test_2() homework.run_test_3()
注意点:
1.为了提高代码的可重复利用性,所以最好功能、用例、运行报告分开写,这点最好养成习惯,很重要
2.模块的命名,为什么要说这个呢,因为这回我在这上面卡了40多分钟,硬是找不到错误,test_case运行一切顺利,但是run_test就是报错,找了半天,最后改了模块名才发现通过了。血的教训,所以一定要记住
3.功能未做注释是因为比较简单,最后的返回值只不过是二度切割,把返回结果的value切出来而已,也可以不切,断言换成self.assertIn()来做,不过那样不够准确,所以不太推荐
4.用例添加进测试套件的方法不止我写的这三种,只不过这三种写起来比较简单,更多的网上也有,这里只是做一个参考和笔记
5.原本test_case中还有setUp()、tearDown()方法,self.Result = Login()也是写在setUp()中的,但是老报错,时间又不够我排查,索性不写了,直接丢case中
6.最后的创建套件并运行也可以不生成报告,报告不是必要的,只是顺手写上去的,也可以直接TextTestRunner运行完毕直接查看控制台
7.果然代码还是要常码,unittest模块以前还是很熟练的,有段时间没碰,写起来就磕磕碰碰的了