unittest模块小结

这次写的是unittest模块的测试用例,属于自动化的门槛,进去了基本算自动化入了门,测试内容很简单,模拟给url推送用户名、密码测试登录功能

先上代码:

#login_test.py
import requests
class Login():
    def test_login(self,username,password):
        url = "http://localhost:8080/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
from ddt import ddt,unpack,data
from openpyxl import load_workbook
import unittest
@ddt
class Run_Test(unittest.TestCase):#继承unittest.TestCase
    """
    读取excel文件和cfg文件中数据
    :param xlsx:
    :param ws:
    :return:
    """
    wb = load_workbook("login_data.xlsx")
    ws = wb.get_sheet_by_name("Sheet1")
    list = []
    list1 = []
    for i in range(1, ws.max_row + 1):
        list = []
        for j in range(1, ws.max_column + 1):
            str = ws.cell(i, j).value
            list.append(str)
        list1.append(list)
    wb.close()
    @data(*list1)
    @unpack
    def test_run1(self,Username,Password,Text):
        self.Result = Login()
        Return = self.Result.test_login(Username,Password)
        self.assertEqual(eval(Return),Text)
        #测试用例
if __name__ == '__main__':
   unittest.main()
#run_test.py
import unittest,HTMLTestRunnerNew
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 = HTMLTestRunnerNew.HTMLTestRunner(stream=fp,title='2019年3月23日作业_测试报告',description='所有测试情况',tester = "桂马")
        # 执行测试套件
        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 = HTMLTestRunnerNew.HTMLTestRunner(stream=fp, title='2019年3月23日作业_测试报告', description='所有测试情况',tester = "桂马")
        # 执行测试套件
        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 = HTMLTestRunnerNew.HTMLTestRunner(stream=fp, title='2019年3月23日作业_测试报告', description='所有测试情况',tester = "桂马")
        # 执行测试套件
        runner.run(suite)
if __name__ == '__main__':
    homework = runtest()
    homework.run_test_1()
    homework.run_test_2()
    homework.run_test_3()

xlsx文件内容如下图:

注意点:

    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模块以前还是很熟练的,有段时间没碰,写起来就磕磕碰碰的了

备注: 

    2019年3月24日更新代码,使用openpyxl、ddt模块优化test_case模块,使用修改后的HTMLTestRunner模块HTMLTestRunnerNew来美化测试报告页面

原文地址:https://www.cnblogs.com/keima/p/10581107.html