Unitest-run

    • 重要概念
      • TestCase
        • 一个TestCase就是一个测试用例,一个完整的测试流程,包括环境准备(setUp),实现过程(run),环境恢复(tearDown)
      • TestSuite
        • TestSuite用来组装单个测试用例,可以通过addTest加载TestCase到TestSuite中,从而返回一个TestSuite实例
      • TestRunner
        • 测试的执行。unitest测试框架中,通过TextTestRunner类提供的run()方法执行TestCase或TestSuite
        • TestRunner可以使用图形界面、文本界面,或者返回一个特殊的值等方式表示测试执行结果
      • TestFixture
        • 对一个测试环境的搭建和销毁就是一个fixture,通过覆盖TestCase的setUp()和tearDown()来实现。
    • 运行测试用例
      • setUp和tearDown
        • setUp测试前准备环境
        • tearDown测试后恢复环境

        • class MyTest(unittest.TestCase):
          def setUp(self):
          print("test start")
          def tearDown(self):
          print("test end")
          class Testadd(MyTest):
          def test_add1(self):
          j=count(1,2)
          self.assertEqual(j.add(),3)
          def test_add2(self):
          j=count(3,4)
          self.assertEqual(j.add(),88,msg="jiao yan cuo wu ")
      • unitest.main()
        • 执行所有test开头的TestCase
      • TestSuite

        • suitt=unittest.TestSuite()
          suitt.addTest(测试类名("TestCase"))
          runner=unittest.TextTestRunner()
          runner.run(suitt)
          ?
      • discover
        • 根据条件自动筛选指定目录下所有测试模块,并可递归查到子目录下的测试模块
        • discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
          • test_dir:要测试的模块名或者目录
          • pattern 表示用例匹配原则
          • top_level=None:测试模块顶层目录,如没有顶层目录,默认为None
        • 使用discover()方法,切记测试用例中需要执行的测试方法必须以test开头,否则无法加载!!!
        • 使用方法

          • test_dir="./"discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
            runner=unittest.TextTestRunner()
            runner.run(discover)
            ?
        • 多目录结构,需要在每个子目录下放一个init.py文件
      • 执行顺序
        • 默认按照0-9,A-Z,a-z,测试类、测试用例按照此顺序加载
        • 执行测试顺序使用TestSuite的addTest()方法
    • 断言
      • Unitest-run
    • 跳过失败和预期失败
      • @unittest.skip(reason)
        • 无条件跳过被装饰的测试方法;
        • reason:理由,描述为什么跳过测试用例
      • @unittest.skipIf(condition,reason)
        • 如果条件为真,则继续执行执行,否则跳过被装饰的测试用例;
      • @unittest.skipUnless(condition,reason)
        • 除非条件为真,否则跳过被装饰的测试用例;
      • @unittest.expectedFailure
        • 将测试用例标记为“预期失败”:
        • 如果测试执行时失败,则测试结果不计为失败;
      • unittest.Skip(reason)
        • 如引发某种定义的异常,则跳过该测试;
        • 一般可以使用TestCase.skip()或者一个跳过装饰器,而不是直接使用
    • TestFixture
      • setUpModule/tearDownModule
        • 整个模块的开始和结束时执行,模块只指的是作用于一个文件,整个文件级别上只调用一次 setUp/tearDown

        • def setUpModule():
          print(‘集成测试 >>>>>>>>>>>>>>开始‘)
          def tearDownModule():
          print("集成测试 >>>>>>>>>>>>>>结束")
      • setUpClass/tearDownClass
        • 测试类开始和结束时执行,必须使用@classmethod 装饰器

        • @classmethod
          def setUpClass(cls):
          print("Test Class Start ----->")
          @classmethod
          def tearDownClass(cls):
          print("Test Class End ----->")
      • setUp/tearDown
        • 测试用例开始和结束时执行
    • 测试报告
      • 测试报告运行

        • import test2from HTMLTestRunner import HTMLTestRunner
          test_dir="./"discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")
          if __name__=="__main__":
          # runner=unittest.TextTestRunner() # runner.run(discover) fp = open("./result.html", "wb")
          runner=HTMLTestRunner(stream=fp,title="测试联系",description="用例执行")
          runner.run(discover)
          fp.close()
      • 修改报告用例的描述
        • 测试类或者函数内增加doc string,即"""备注"""
    • 邮件发送
      • 库 smtplib,安装pyEmail
      • 实际使用


import unittest
import time,os
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from HTMLTestRunner import HTMLTestRunner


def send_report(report_fiele):
    smtpserverip = "smtp.126.com"
    username = "XXXX"
    password = "XXX"
    sender = "XXX"
    receviver = "XXX"

    #不发送附件时设置邮件主题和内容
    subject = "python email test file"
    msg = MIMEText(<html><h1>你好!</html></h1>,html,utf-8)
    msg[Subject]=Header(subject,utf-8)



    # sendfile=open(report_fiele,rb).read()
    #
    # subject = "python email test file"
    # msg = MIMEText(sendfile,"base64",utf-8)
    # msg["Subject"] = Header(subject,"utf-8")
    # msg["Content-Type"] = aoolication/octet-stream
    # msg[Content-Disposition]=attachment;filename="result.html"
    # msgRoot = MIMEMultipart("read")
    # msgRoot[Subject] = subject
    # msgRoot.attach(msg)


    smtp = smtplib.SMTP()
    smtp.connect(smtpserverip)
    smtp.login(username,password)
    smtp.sendmail(sender,receviver,msg.as_string())
    smtp.quit()

def find_new_report(result_dir):

    lists = os.listdir(result_dir)
    lists.sort(key=lambda fn:os.path.getmtime(result_dir+\\+fn))
    report_fiele = os.path.join(result_dir,lists[-1])
    return report_fiele
if __name__=="__main__":
    test_dir = "./"
    result_dir = "./"

    discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
    now = time.strftime(%Y-%m-%d %H_%M_%S)
    result_name = result_dir + "/" + now + result.html

    fp = open(result_name, "wb")
    runner=HTMLTestRunner(stream=fp,title="测试联系",description="用例执行")
    runner.run(discover)
    fp.close()

    new_report = find_new_report(result_dir)
    send_report(new_report)

 

     

Unitest-run

上一篇:React中关于使用map遍历绑定key值问题


下一篇:linux 获取ntp客户端