[Unittest] 自動テスト フレームワークのコア要素

【ソフトウェアテスト面接短期集中講座】ソフトウェアテストの8部作エッセイチュートリアルを1週間で強制的に終わらせる方法 面接終了後は安定、高収入のソフトウェアテストエンジニア(自動テスト)にもなれる

1. Unittest フレームワークとは何ですか?
Python には単体テスト フレームワークが付属しています

2. UnitTest フレームワークを使用する理由は何ですか?

>バッチ実行のユースケース

>豊富なアサーション知識を提供する

>レポートを生成できる

3. 核となる要素:

1).TestCase(テストケース)

2). TestSuite (テストスイート)

3). TestRunner (テスト実行、TestUite テストスイートの実行)

4). TestLoader (テストケースを一括実行 - 指定フォルダ内の指定文字で始まるモジュールを検索) [推奨]

5). フィクスチャ (2 つの固定関数、1 つは初期化中に使用され、もう 1 つは終了時に使用されます))

次に、単体テスト フレームワークを理解するためにコア要素を拡張します。

まず、unittest のユースケース ルールを紹介します。

1. テスト ファイルはパッケージをインポートする必要があります: import Unittest

2. テスト クラスは、unittest.TestCase を継承する必要があります。

3. テスト メソッドは test_ で始まる必要があります。

1.TestCase(テストケース)

1. これはコード ファイルであり、実際のユースケース コードはコード ファイル内に記述されます (内部のプリントはすべてシミュレーション テスト ケースです)

# 1、导包
# 2、自定义测试类
# 3、在测试类中书写测试方法 采用print 简单书写测试方法
# 4、执行用例
 
import unittest
 
# 2、自定义测试类,需要继承unittest模块中的TestCase类即可
class TestDemo(unittest.TestCase):
    # 书写测试方法,测试用例代码,书写要求,测试方法必须test_ 开头
    def test_method1(self):
        print('测试方法1-1')
 
    def test_method2(self):
        print('测试方法1-2')
 
# 4、执行测试用例
# 4.1 光标放在类后面执行所有的测试用例
# 4.2 光标放在方法后面执行当前的方法测试用例

注: def で定義された test_ はテスト ケースです。テスト ケースは __name__ == '___mian___' が実行された場合にのみ実行されます。他の通常の関数は実行されず、self を通じて呼び出され実行されます。

2. TestSuite(テストスイート)とTestRunner(テスト実行)

1. TestSuite (テスト スイート): 複数の TestCase (テスト ケース) ファイルをアセンブル、パッケージ化、および管理するために使用されます。

2. TestRunner (テスト実行): TestSuite (テスト スイート) の実行に使用されます。

コード: まず、TestSuite と TestRunner を実装するには、複数のテスト ケース ファイルを準備する必要があります。次のコードでは、unittest_Demo2 と Unittest_Demo1 の 2 つのテスト ケース ファイルを準備します。

# 1、导包
# 2、实例化(创建对象)套件对象
# 3、使用套件对象添加用例方法
# 4、实例化对象运行
# 5、使用运行对象去执行套件对象
 
import unittest
 
from unittest_Demo2 import TestDemo
from unittest_Demo1 import Demo
 
suite = unittest.TestSuite()
 
# 将⼀个测试类中的所有⽅法进⾏添加
# 套件对象.addTest(unittest.makeSuite(测试类名))
suite.addTest(unittest.makeSuite(TestDemo))
suite.addTest(unittest.makeSuite(Demo))
 
# 4、实例化运行对象
runner = unittest.TextTestRunner();
# 5、使用运行对象去执行套件对象
# 运⾏对象.run(套件对象)
runner.run(suite)

3. TestLoader(テストロード)

例証します:

修飾されたテスト メソッドをテスト スイートに追加します。
2. 指定されたディレクトリ ファイル内の指定された文字で始まるモジュール ファイルの下で test から始まるメソッドを検索し、これらのメソッドをテスト スイートに追加し、最後にテスト スイートを返します。

3. Testsuite 機能と同様に、他の機能を補足するものであり、テスト ケースを組み立てるために使用されます。

通常、テストケースは Case フォルダに記述されますが、テストケースが多すぎる場合は TestLoader を検討するとよいでしょう。

写法:
1. suite = unittest.TestLoader().discover("指定搜索的目录文件","指定字母开头模块文件")
2. suite = unittest.defaultTestLoader.discover("指定搜索的目录文件","指定字母开头模块文件") 【推荐】
注意:
  如果使用写法1,TestLoader()必须有括号。
# 1. 导包
# 2. 实例化测试加载对象并添加用例 ---> 得到的是 suite 对象
# 3. 实例化 运行对象
# 4. 运行对象执行套件对象
 
import unittest
 
# 实例化测试加载对象并添加用例 ---> 得到的是 suite 对象
# unittest.defaultTestLoader.discover('用例所在的路径', '用例的代码文件名')
# 测试路径:相对路径
# 测试文件名:可以使用 * 通配符,可以重复使用
suite = unittest.defaultTestLoader.discover('./Case', 'cs*.py')
runner = unittest.TextTestRunner()
runner.run(suite)
TestSuite与TestLoader区别:
  共同点:都是测试套件
  不同点:实现方式不同
    TestSuite: 要么添加指定的测试类中所有test开头的方法,要么添加指定测试类中指定某个test开头的方法
    TestLoader: 搜索指定目录下指定字母开头的模块文件中以test字母开头的方法并将这些方法添加到测试套件中,最后返回测试套件

4. フィクスチャ(テストフィクスチャ)

これは、特定の状況下で自動的に実行されるコード構造です。

4.1 メソッドレベル

各テストメソッド(ユースケースコード)の実行前後に自動的に呼び出される構造体

def setUp()、各テストメソッドが実行される前に実行されます(初期化)

def teaDown()、各テストメソッドが実行された後に実行(解放)されます。

特徴: 複数のテスト関数が複数回実行されます。SetUpは各テスト関数の実行前に実行され、tearDwonは実行後に実行されます。

# 初始化
def setUp(self):
    # 每个测试方法执行之前执行的函数
    pass
 
# 释放
def tearDown(self):
    # 每个测试方法执行之后执行的函数
    pass
场景:当你要登录自己的用户名账户的时候,都会输入网址,当你准备不用这个页面了,都会关闭当前页面;
  1、输入网址 (方法级别)
  2、关闭当前页面 (方法级别)

4.2 クラスレベル

各テストクラスのすべてのメソッドが実行される前後に自動的に呼び出される構造体 (クラス全体で実行の前後に 1 回)

def setUpClass()、クラス内のすべてのメソッドの前

def tearDownClass()、クラス内のすべてのメソッドの後

機能: テスト クラスが実行される前に setUpClass を 1 回実行し、クラスの実行後に TearDownClass を 1 回実行します。

注: クラスメソッドは @classmethod で修飾する必要があります

  @classmethod
    def setUpClass(cls):
        print('-----------1.打开浏览器')
 
    @classmethod
    def tearDownClass(cls):
        print('------------5、关闭浏览器')

ケーステンプレート: クラスレベルとメソッドレベルの実装の組み合わせ

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-GBxQV2uP-1647245316010) (C:/Users/15277/AppData/Roaming/Typora/) typora-user-images/image-20220303153824329.png)]

提示:
  无论使用函数级别还是类级别,最后常用场景为:
    初始化:
      1. 获取浏览器实例化对象
      2. 最大化浏览器
      3. 隐式等待
    结束:
      关闭浏览器驱动对象

5.主張☆

1. アサーションとは:

手動作業をプログラムに置き換えて、期待される結果が実際の結果と一致しているかどうかを自動的に判断させます。

アサーションの結果:

1)、真、ユースケースは合格です

2)、False、コードは例外をスローし、ユースケースは失敗します。

3).単体テストでアサーションを使用するには、self.assert メソッドを渡す必要があります。

2. なぜ次のように主張する必要があるのでしょうか。

自動化スクリプトは無人で実行され、自動化スクリプトの実行が成功したかどうかを判断するにはアサーションが必要です。

注: 自動化スクリプトはアサーションを作成しません。これは、テストを実行しないことと同じです。

3. 一般的に使用されるアサーション:

self.assertEqual(ex1, ex2) # 判断ex1 是否和ex2 相等
self.assertIn(ex1, ex2) #  ex2是否包含 ex1   注意:所谓的包含不能跳字符
self.assertTrue(ex) #  判断ex是否为True
 
重点讲前两个assertEqual 和 assertIn
方法:
assertEqual:self.assertEqual(预期结果,实际结果) 判断的是预期是否相等实际
assertIn:self.assertIn(预期结果,实际结果) 判断的是预期是否包含实际中
assertIn('admin', 'admin') # 包含
assertIn('admin', 'adminnnnnnnn') # 包含
assertIn('admin', 'aaaaaadmin') # 包含
assertIn('admin', 'aaaaaadminnnnnnn') # 包含
assertIn('admin', 'addddddmin') # 不是包含
# Login 函数我已经封装好了,这里直接导包调用就可以了。
 
import unittest
 
from login import Login
 
class TestLogin(unittest.TestCase):
    """正确的用户名和密码: admin, 123456, 登录成功"""
 
    def test_success(self):
        self.assertEqual('登录成功', Login('admin', '123456'))
 
    def test_username_error(self):
        """错误的用户名: root, 123456, 登录失败"""
        self.assertEqual('登录失败', Login('root', '123456'))
 
    def test_password_error(self):
        """错误的密码: admin, 123123, 登录失败"""
        self.assertEqual('登录失败', Login('admin', '123123'))
 
    def test_error(self):
        """错误的用户名和错误的密码: aaa, 123123, 登录失败"""
        # self.assertEqual('登录失败',Login('登陆失败','123123'))
        self.assertIn('失败', Login('登录失败', '123123'))

6.スキップ

テスト条件を満たさず実行したくない一部の未完了のテスト関数およびテスト クラスについては、スキップを使用できます。

"""
使用方法,装饰器完成
代码书写在 TestCase 文件
"""
# 直接将测试函数标记成跳过
@unittest.skip('跳过条件')
# 根据条件判断测试函数是否跳过 , 判断条件成立, 跳过
@unittest.skipIf(判断条件,'跳过原因')
import unittest
 
version = 20
 
class TestDemo1(unittest.TestCase):
    
    @unittest.skip('直接跳过')
    def test_method1(self):
        print('测试用例1-1')
 
    @unittest.skipIf(version > 19, '版本大于19,测试跳过')
    def test_method2(self):
        print('测试用例1-2')

結果

7. データドリブン(単体DDT)☆

ddt:データドライバーテスト

データ駆動型: データはテスト ケース全体の実行を推進します。つまり、テスト データがテスト結果を決定します。

データ駆動型ソリューションが解決する問題は次のとおりです。

1) コードの重複を避けるためにコードとデータを分離する

2) 繰り返しのコードロジックを記述しないでください。

ddt パッケージを使用するには、Python インタープリターにインストールする必要があります。

 

インストールされているかどうかを確認するには、cmd に pip list と入力し、名前を付けます。ddt があればインストールは成功です。

文法:

1. データドライバーを使用するには、クラスの前に修飾子 @ddt を追加します。

注: このメソッドでは print が使用されています。便宜上、主にデータ駆動型の学習を目的としてテスト ケースがシミュレートされています。実際には、テスト ケースのコードはメソッド内に記述されます。

import unittest
from ddt import ddt, data
 
@ddt  
class TestDemo(unittest.TestCase):
    # 单一参数
    @data('17611110000', '17611112222')
    def test_1(self, phone):
        print('测试一电话号码:', phone)
        
if __name__ == '__main__':
    unittest.main()
else:
    pass

1) セレンで ddt を使用する

"""
unittest + selenium
"""
import unittest
from time import sleep
 
from ddt import ddt, data
from selenium import webdriver
 
@ddt
class TestBaidu(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.get('https://www.sogou.com/')
 
    def tearDown(self) -> None:
        sleep(3)
        self.driver.quit()
  
    # 单一参数
    @data('易烊千玺', '王嘉尔')
    def test_01(self, name):
        self.driver.find_element_by_id('query').send_keys(name)
        self.driver.find_element_by_id('stb').click()
 
if __name__ == '__main__':
    unittest.main()

self: Java のこれに相当し、現在のオブジェクトへの参照。self.driver はドライバー変数を定義します。

2. 実際には、単一のパラメータを渡すことは不可能であり、複数のパラメータが使用されます。

注意事项:
1)、多个数据传参的时候@data里面是要用列表形式
2)、会用到 @unpack 装饰器 进行拆包,把对应的内容传入对应的参数;
import unittest
from ddt import ddt, data, unpack
 
@ddt
class TestDemo(unittest.TestCase):
    # 多参数数据驱动
    @data(['admin', '123456'])
    # unpack 是进行拆包,不然会把列表里面的数据全部传到username这个一个参数,我们要实现列表中的两个数据分别传入对应的变量中
    @unpack
    def test_2(self, username, password):
        print('测试二:', username, password)
 
 
if __name__ == '__main__':
    unittest.main()
else:
    pass

ただし、上記の手順はコード内のデータに関するものであり、携帯電話番号などのデータをテストしたい場合、それらをすべて @data デコレータに記述するのは非常に面倒で、コードとデータの分離につながります。データドライバー内で。

3. データをテキスト ファイルに配置し、JSON、Excel、xml、txt、その他の形式のファイルなどのデータをファイルから読み取ります。ここでは json ファイル タイプを示します。

json ファイルの処理。このリンクでは、json ファイルと Python ファイルの基本的な操作を紹介します。

(1)、json ファイルによって駆動される

[
  {
    "username": "admin",
    "password": "123456"
  },
  {
    "username": "normal",
    "password": "45678"
  }
]
(2) テストコード内のjsonファイルを読み込む
import json
import unittest
from ddt import ddt, data, unpack
 
# 用json多个参数读取
def reads_phone():
    with open('user.json', encoding='utf-8') as f:
        result = json.load(f)  # 列表
        return result
    
@ddt
class TestDemo(unittest.TestCase):
    # 多参数数据驱动
    @data(*reads_phone())
    # unpack 是进行拆包,不然会把列表里面的数据全部传到username这个一个参数,我们要实现列表中的两个数据分别传入对应的变量中
    @unpack
    def test_2(self, username, password):
        print('测试二:', username, password)
 
 
if __name__ == '__main__':
    unittest.main()
else:
    pass
注意事项:
1、with open里面默认是 ”r“ 
2、@data 里面的 * 含义是实现每个json对象单个传入方法执行,不然会吧json文件里面所用数据全部传入 
  > * 是元祖;
  > ** 是字典;
3、参数不能传错,要对应

結果:

(3)、txtファイルドライバー

1 つの線がグループを表します。

admin,123456
normal,456789
 
import unittest
def read():
    lis = []
    with open('readtext.txt', 'r', encoding='utf-8') as f:
        for line in f.readlines():
            # lis.append(line) #  ['admin,123456\n', 'normal,456789\n']
            # lis.append(line.strip('\n'))  ['admin,123456', 'normal,456789'] 两个字符串
            lis.append(line.strip('\n').split(','))  # [['admin', '123456'], ['normal', '456789']]
    return lis
 
class TestDome(unittest.TestCase):
    def test_01(self):
        li = read()
        print(li)
 
 
if __name__ == '__main__':
    unittest.main()
"""
split():一个字符串里面用某个字符分割,返回列表
strip():去掉两边的字符或者字符串,默认删除空白符(包括'\n', '\r',  '\t',  ' ')
"""
(3)、csvファイルドライバー
供应商名称,联系人,移动电话
英业达,张三,13261231234
阿里巴巴,李四,13261231231
日立公司,王五,13261231233

書き方1:

"""
编写 csvv.py脚本读取csv中的测试数据
"""
import csv
class ReadCsv():
    def read_csv(self):
        lis = []
        # 用csv的API的reader方法!!!!
        data = csv.reader(open('testdata.csv', 'r'))  #!!!!
        next(data, None)
        for line in data:
            lis.append(line)
            # lis.append(line[0])  # 二维数组可以省略行,列不可以省略
            # lis.append(line[1])
 
        return lis
 
# 实例化类
readCsv = ReadCsv()
# 打印类中的方法
print(readCsv.read_csv())

書き方2:推奨

def csvTest():
    li = []
    with open('user.csv', 'r', encoding='utf-8') as f:
        filename = csv.reader(f)
        next(filename, None)
        for r in filename:
            li.append(r)
        return li

 (4)、yamlファイルドライバー

-
  username: admin9
  password: 123456
-
  username: normal
  password: 789456

対応するjsonファイル

[
  {
    "username": "admin9",
    "password": 123456
  },
  {
    "username": "normal",
    "password": 7894
  }
]

書き方:

"""
使用yaml数据驱动
"""
 
import unittest
from time import sleep
 
from selenium import webdriver
from ddt import ddt, data, unpack, file_data
 
 
@ddt
class YamlTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.get('file:///D:/%E6%A1%8C%E9%9D%A2/page/%E6%B3%A8%E5%86%8CA.html')
        self.driver.maximize_window()
 
    def tearDown(self) -> None:
        driver = self.driver
        sleep(3)
        driver.quit()
 
    # file_data 传入多个参数的时候,@unpack 的解包不起作用
    @unittest.skip
    @file_data('../user.yaml')
    @unpack
    def test_yaml01(self, username, password):
        driver = self.driver
        driver.find_element_by_id('userA').send_keys(username)
        driver.find_element_by_id('passwordA').send_keys(password)
 
    # 注意:传的参数名称要与yaml文件对应
    # 在yaml数据中文件中采用对象(键值对)的方式来定义数据内容
    @file_data('../user1.yaml')
    def test_yaml02(self, username, password):
        driver = self.driver
        driver.find_element_by_id('userA').send_keys(username)
        driver.find_element_by_id('passwordA').send_keys(password)
 
 
if __name__ == '__main__':
    unittest.main()

注: file_date デコレータは yaml および json ファイルを直接読み取ることができます

(4)、Excelファイルドライバー

Excel テーブルを作成するときは、pychram を終了し、ルート ディレクトリに Excel テーブルを作成して保存する必要があります。そうしないと、エラーが報告されます。

def read_excel():
    xlsx = openpyxl.load_workbook("../excel.xlsx")
    sheet1 = xlsx['Sheet1']
    print(sheet1.max_row)  # 行
    print(sheet1.max_column)  # 列
    print('=======================================================')
    allList = []
    for row in range(2, sheet1.max_row + 1):
        rowlist = []
        for column in range(1, sheet1.max_column + 1):
            rowlist.append(sheet1.cell(row, column).value)
        allList.append(rowlist)
    return allList

Excel を使用して csdn 操作にログインします

"""
测试excel数据驱动
"""
 
import unittest
from time import sleep
 
import openpyxl as openpyxl
from ddt import ddt, data, unpack
from selenium import webdriver
 
 
# 读取excel表中的数据,使用xlrd,openpyxl
def read_excel():
    xlsx = openpyxl.load_workbook("../excel.xlsx")
    sheet1 = xlsx['Sheet1']
    print(sheet1.max_row)  # 行
    print(sheet1.max_column)  # 列
    print('=======================================================')
    allList = []
    for row in range(2, sheet1.max_row + 1):
        rowlist = []
        for column in range(1, sheet1.max_column + 1):
            rowlist.append(sheet1.cell(row, column).value)
        allList.append(rowlist)
    return allList
 
 
@ddt
class ExcelText(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.get('https://passport.csdn.net/login?code=applets')
        self.driver.maximize_window()
 
    def tearDown(self) -> None:
        driver = self.driver
        sleep(3)
        driver.quit()
 
    @data(*read_excel())
    @unpack
    def test_excel01(self, flag, username, password):
        print(flag, username, password)
        driver = self.driver
        sleep(2)
        driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div/div[1]/span[4]').click()
        driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div/div[2]/div/div[1]/div/input').send_keys(username)
        driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div/div[2]/div/div[2]/div/input').send_keys(password)
        driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div[2]/div[1]/div/div[2]/div/div[4]/button').click()
 
if __name__ == '__main__':
    unittest.main()

10. スクリーンショットの操作

ユースケースを実行するたびに成功することは不可能であり、失敗する場合も必ずあります。エラーをキャプチャしてエラーのスクリーンショットを保存できれば、これは優れた機能となり、エラーの特定も容易になります。

スクリーンショットの方法:driver.get_screenshot_as_file

"""
捕捉异常截图测试
"""
import os.path
import time
import unittest
from time import sleep
 
from selenium import webdriver
 
 
class ScreeshotTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.get('https://www.sogou.com/')
        self.driver.maximize_window()
 
    def tearDown(self) -> None:
        sleep(3)
        driver = self.driver
        driver.quit()
 
    def test_01(self):
        driver = self.driver
        driver.find_element_by_id('query').send_keys("易烊千玺")
        driver.find_element_by_id('stb').click()
        sleep(3)
        print(driver.title)
        try:
            self.assertEqual(driver.title, u"搜狗一下你就知道", msg="不相等")
        except:
            self.saveScreenShot(driver, "shot.png")
        sleep(5)
 
    def saveScreenShot(self, driver, filename):
        if not os.path.exists("./imge"):
            os.makedirs("./imge")
 
        # 格式十分重要,小写大写敏感 %Y%m%d-%H%M%S
        now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
        driver.get_screenshot_as_file("./imge/" + now + "-" + filename)
        sleep(3)
 
 
if __name__ == '__main__':
    unittest.main()

11. 試験報告書

テスト レポートには次の 2 種類があります。

1. 組み込みのテスト レポート 2. サードパーティのテスト レポートの生成

9.1 テストレポートを持参する

TestCase のコードが個別に実行された場合にのみ、テスト レポートが生成されます。

 

 

10.2 サードパーティのテストレポートの生成

ここでは、クラス モジュールを実行するサードパーティのテストが必要で、それをコードのディレクトリに配置します。

 これら 2 つのモジュールと同様に、コード ディレクトリに配置します。

步骤:
 1. 获取第三方的 测试运行类模块 , 将其放在代码的目录中
 2. 导包 unittest
 3. 使用 套件对象, 加载对象 去添加用例方法
 4. 实例化 第三方的运行对象 并运行 套件对象
   HTMLTestRunner()

コピー

書き方1:

import unittest
 
from HTMLTestRunner import HTMLTestRunner
 
suite = unittest.defaultTestLoader.discover('.', 'Uni*.py')
file = 'report1.html'
with open(file, 'wb') as f:
    runner = HTMLTestRunner(f, 2, '测试报告', 'python3.10')  # 运行对象
    # 运行对象执行套件, 要写在 with 的缩进中
    runner.run(suite)

書き方 2:

"""
生成测试报告
"""
import os.path
import sys
import time
import unittest
from time import sleep
 
from HTMLTestRunner import HTMLTestRunner
 
def createsuite():
    discovers = unittest.defaultTestLoader.discover("./cases", pattern="cs*.py")
    print(discovers)
    return discovers
 
 
if __name__ == '__main__':
    # 当前路径
    # sys.path 是一个路径的集合
    curpath = sys.path[0]
    print(sys.path)
    print(sys.path[0])
 
    # 当前路径文件resultreport不存在时,就创建一个
    if not os.path.exists(curpath+'/resultreport'):
        os.makedirs(curpath+'/resultreport')
 
    # 2、解决重名问题
    now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
    print(time.time())
    print(time.localtime(time.time()))
    # 文件名是 路径 加上 文件的名称
    filename = curpath+'/resultreport/'+now+'resultreport.html'
    # 打开文件html,是用wb以写的方式打开
    with open(filename, 'wb') as f:
        runner = HTMLTestRunner(f, 2, u"测试报告", u"测试用例情况")
        suite = createsuite()
        runner.run(suite)

ここでの現在のパスを ./使用して表すこと。

"""
生成测试报告
"""
import os.path
import sys
import time
import unittest
from time import sleep
from HTMLTestRunner import HTMLTestRunner
 
def createsuite():
    discovers = unittest.defaultTestLoader.discover("./cases", pattern="cs*.py")
    print(discovers)
    return discovers
 
 
if __name__ == '__main__':
    # 当前路径文件resultreport不存在时,就创建一个
    if not os.path.exists('./resultreport'):
        os.makedirs('./resultreport')
 
    # 2、解决重名问题
    # 格式十分重要 %Y-%m-%d-%H %M %S
    now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
    print(time.time())
    print(time.localtime(time.time()))
    # 文件名是 路径 加上 文件的名称
    filename = './resultreport/'+now+'resultreport.html'
    # 打开文件html,是用wb以写的方式打开
    with open(filename, 'wb') as f:
        runner = HTMLTestRunner(f, 2, u"测试报告", u"测试用例情况")
        suite = createsuite()
        runner.run(suite)

知らせ:

サードパーティの実行オブジェクトをインスタンス化します。HTMLTestRunner() の初期化には、さまざまなカスタマイズ可能な設定があります。

 HTMLTestRunner()
 1、stream=sys.stdout, 必填,测试报告的文件对象(open ), 注意点,要使用 wb 打开
 2、verbosity=1, 可选, 报告的详细程度,默认 1 简略, 2 详细
 3、title=None, 可选, 测试报告的标题
 4、description=None 可选, 描述信息, Python 的版本, pycharm 版本

 最終結果が生成されます

単体テスト フレームワークは基本的にこの知識に基づいていますが、覚えておくべきことがたくさんあるため、記憶を形成するためにさらにコードを入力する必要があります...

 以下はサポート学習教材です。[ソフトウェア テスト] を行っている友人にとって、これは最も包括的で完全な準備倉庫となるはずです。この倉庫は、最も困難な旅にも同行してくれました。また、あなたのお役に立てれば幸いです。

ソフトウェアテストインタビューアプレット

何百万人もの人々が使用しているソフトウェア テストの質問バンクです。誰が知っているのか!インターネット上で最も包括的な面接テスト ミニ プログラムです。携帯電話を使用して質問に答えたり、地下鉄やバスに乗ったり、試験に参加したりすることができます。

次のインタビューの質問セクションをカバーします。

1. ソフトウェアテストの基礎理論、2. Web、アプリ、インターフェース機能テスト、3. ネットワーク、4. データベース、5. Linux

6. Web、アプリ、インターフェイスの自動化、7. パフォーマンス テスト、8. プログラミングの基本、9. 人事面接の質問、10. 公開テストの質問、11. セキュリティ テスト、12. コンピューターの基本

 

書類の入手方法:

この文書は、[ソフトウェア テスト] に参加したい友人にとって、最も包括的かつ完全な準備倉庫となるはずです。この倉庫は、私が最も困難な旅を乗り越えるのにも同行してくれました。また、あなたのお役に立てれば幸いです。

上記はすべて共有可能で、vx 公式アカウント「Programmer Hugo」を検索するだけで無料で入手できます。

おすすめ

転載: blog.csdn.net/2301_79535544/article/details/133182569