В этой статье вы познакомитесь с широко используемой средой автоматического тестирования Python — Pytest!
В этой статье вы познакомитесь с широко используемой средой автоматического тестирования Python — Pytest!

В предыдущей статье мы узнали о UnitTest, встроенной среде тестирования Python, но UnitTest имеет определенные ограничения.

В этой статье мы узнаем о сторонней платформе Pytest, которая имеет больше оптимизаций, сохраняя при этом синтаксис платформы UnitTest.

Базовое введение в Pytest

Давайте сначала кратко представим Pytest и связанный с ним контент.

среда модульного тестирования

Прежде всего нам нужно знать, что тестирование обычно делится на четыре аспекта тестирования:

  • Модуль: называется модульным тестом,Для самой маленькой единицы проектирования программного обеспечения – программный модуль,Работа над проверкой правильности
  • Интегрированный тест: называется тестом сборки.,Обычно на основе юнит-теста,Расположите все программные модули упорядоченно и поэтапно.,Сосредоточьтесь на интерфейсных частях различных модулей.
  • Системное тестирование. Рассматривайте всю программную систему как единое целое, включая тестирование функций, производительности, а также программной и аппаратной среды, в которой работает программное обеспечение.
  • Приемочная проверка: относится к проверке и проверке всей системы в соответствии с заявлением о миссии проекта или контрактом, а также документами, подтверждающими приемку, согласованными между сторонами спроса и предложения.,Решите, принять или отклонить систему

Наша статья в основном посвящена модульному тестированию:

  • Python: UnitTest и Pytest обычно используются для автоматизации модулей.,Но Pytest стал мейнстримом
  • Java: Testng и Junit обычно используются для автоматизации модульного тестирования.,Но Testng стал мейнстримом

Наконец, нам нужно понять основные функции среды модульного тестирования:

  • Откройте для себя варианты использования тестов
  • Выполнить тестовый вариант использования
  • Судить результаты теста
  • Создать отчет о тестировании

Базовое введение в структуру

Давайте кратко представим фреймворк Pytest:

  • pytest — очень зрелая среда модульного тестирования,После нескольких версий итераций,Основные преимущества – гибкость и простота.
  • pytest имеет чрезвычайно сильную совместимость и экологическую среду. Его можно комбинировать с селеном, запросами и appium для выполнения различных задач автоматизации.
  • pytest имеет лучший эффект отображения страниц, может генерировать настраиваемые отчеты об привлекательности и непрерывную интеграцию с Jenkins.

Ниже мы приводим некоторые типы фреймворков, которые можно хорошо интегрировать с фреймворком Pytest:

  • pytestpytest-html: плагин, в основном используемый для создания отчетов в формате html.
  • pytest-xdist: плагин, в основном используемый для многопоточной работы.
  • pytest-ordering: плагин, в основном используемый для изменения порядка выполнения вариантов использования.
  • pytest-rerunfailres: плагин, в основном используемый для повторного запуска неудачных тестовых случаев.
  • allure-pytest: в основном используется для создания красивых и настраиваемых отчетов Allure.

Мы можем использовать относительно простой способ загрузить эти фреймворки сразу:

Язык кода:javascript
копировать
# Сначала нам нужно поместить все эти имена в текстовый файл, предполагая, что мы поместили их в файл requestment.txt.

# файл requestment.txt
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures

# Нам нужно всего лишь ввести команду в консоли pycharm, чтобы загрузить все содержимое папки.
pip install -r requirements.txt

Базовое использование Pytest

Далее мы познакомим вас с основами использования Pytest.

Тестовые примеры Pytest по умолчанию

Ниже мы сначала объясним формат Тестовых образцов Pytest по умолчанию:

Язык кода:javascript
копировать
# Прежде всего, имена наших модулей (имена файлов) обычно хранятся в папке тестовых случаев, а затем нам нужно убедиться, что имя модуля должно начинаться с test_ или заканчиваться на _test.
# Например, имя нашего модуля ниже является правильным примером.
test_demo1
demo2_test

# Затем нам нужно отметить, что имя тестового класса в нашем модуле должно начинаться с Test и не может иметь метод init.
# Например, правильное название класса приведено ниже.
class TestDemo1:
class TestLogin:

# Наконец, нам нужно отметить, что имя метода теста (имя Case) в нашем тестовом классе должно начинаться с test_.
# Например, имя нашего модуля ниже является правильным примером.
test_demo1(self)
test_demo2(self)

# Приведем пример тестового варианта использования:
# Имя файла — test_demo1.
class TestDemo:
    def test_demo1(self):
        print("тестовый вариант использования 1")

    def test_demo2(self):
        print("тестовый вариант использования 2")
        
# Конечно, наши вышеуказанные требования не обязательно должны быть одинаковыми. Мы можем внести изменения в будущем. Метод выполнения мы объясним ниже.

Затем давайте объясним, как выполнять тестовые примеры Pytest:

Язык кода:javascript
копировать
# Сначала давайте объясним файл глобальной конфигурации pytest.ini.
# Мы можем настроить некоторые свойства в pytest.ini, чтобы изменить свойства Pytest по умолчанию. Нам нужно создать его в корневом каталоге проекта, и имя должно быть pytest.ini.

1 [pytest]
2 #параметр
3 addopts = ‐vs 				# Это относится к некоторым вспомогательным параметрам при использовании команды по умолчанию, о которых мы расскажем позже.
4 testpaths = ./testcases		# Это относится к пути выполнения по умолчанию, который будет выполнять все тестовые случаи в папке, которые по умолчанию соответствуют условиям.
5 python_files = test_*.py		# Вот правила именования файлов, о которых мы упоминали ранее.
6 python_classes = Test*		# Вот правила именования имен классов, о которых мы упоминали ранее.
7 python_functions = test_*		# Вот правило именования случаев, о котором мы упоминали ранее.
8 #отметка
9 markers =						# Вот правила курения, о которых мы поговорим позже.
10 дым: вариант использования дыма				 
11 Product_manage: Управление продуктами		


# Тогда давайте сначала поговорим о том, как запустить Pytest с помощью командной строки консоли.
# Самое простое — ввести pytest непосредственно в командной строке консоли. Если pytest.ini существует, он будет выполнен в соответствии с содержимым файла, если нет, он будет выполнен в соответствии с форматом по умолчанию.
# Но мы можем расширить директиву параметра pytest с помощью некоторых параметров.

# -vs: -v вывести подробную информацию -s выводить отладочную информацию
pytest -vs

# -n: Многопоточная работа (предварительным условием является установка плагина: pytest-xdist)
pytest -vs -n=2

# --reruns num: Перезапуск после сбоя (предварительным условием является установка плагина: pytest-rerunfailres)
pytest -vs --reruns=2

# -x: Остановитесь, если вариант использования не удался
pytest -vs -x

# --maxfail: Завершить работу после нескольких неудач
pytest -vs --maxfail=2

# --html: Создать тестовый отчет HTML, позже Вам необходимо следить за расположением и именем созданного файла (обязательное условие — установка плагина: pytest-html)
pytest -vs --html ./reports/result.html

# -k: Чтобы запустить тестовый вариант использования, имя которого содержит определенную строку, мы можем использовать или для ее выражения или и для выражения того и другого.
# Использование или означает: имя текущего варианта использования содержит данные по обеим сторонам или.
# Использование и означает: имя текущего варианта использования удовлетворяет условию только в том случае, если оно содержит все данные с обеих сторон и.
pytest -vs -k "qiuluo"
pytest -vs -k "qiuluo or weiliang"
pytest -vs -k "qiuluo and weiliang"

# -m: выполнение варианта использования дыма, после которого должно следовать имя дыма.
# Здесь мы кратко представляем метод выполнения варианта использования дыма. На самом деле мы имеем метод группового выполнения.
# Например, наши варианты использования разделены на тест управления пользователями user_manage и тест управления продуктом Product_manage, и мы хотим выполнить только один из них.

# Сначала нам нужно разделить @mark на разные методы. Конкретные операции заключаются в следующем:
class TestDemo:
    
    # Мы используем @pytest.mark в Case. + Имя группы эквивалентно методу, разделенному на группу.
    # Примечание. В группе может быть несколько методов, и метод также можно разделить на несколько групп.
    @pytest.mark.user_manage
    def test_demo1(self):
        print("user_manage_test1")

    @pytest.mark.product_manage
    def test_demo2(self):
        print("product_manage_test1")
     
    @pytest.mark.user_manage
    @pytest.mark.product_manage
    def test_demo3(self):
        print("manage_test1")

# Нам нужно использовать только -m, о котором мы упоминали ранее, во время выполнения. + Просто название группы
pytest -vs -m user_manage

# Вставьте сюда предложение, мы можем использовать метод генерации исключений для имитации сбоя теста во время работы: поднять Exception() выдать исключение


# Наконец, мы также можем использовать основной метод для выполнения pytest, а также использовать параметры для настройки.
if __name__ == '__main__':
	pytest.main()
    
if __name__ == '__main__':
	pytest.main(["‐vs"])

Наконец, мы вставляем простой метод пропуска регистра:

Язык кода:javascript
копировать
# Метод пропуска случая в pytest на самом деле точно такой же, как и unittest.
# Нам нужно только использовать метод Skip или Skipif, чтобы указать параметры и вставить их в метод для пропуска.

# @pytest.mark.skip (причина пропуска)

# @pytest.mark.skipif(условие пропуска, причина пропуска)

# Мы приводим пример
class TestDemo:
    
    workage2 = 5
    workage3 = 20
    
    @pytest.mark.skip(reason="Пропустить без причины")
    def test_demo1(self):
        print("Меня пропустили")

    @pytest.mark.skipif(workage2<10,Reason="Пропуск менее 10 лет опыта работы")    
    def test_demo2(self):
        print("Меня пропустили из-за отсутствия опыта")
    
    @pytest.mark.skipif(workage3<10,Reason="Пропуск менее 10 лет опыта работы")
    def test_demo3(self):
        print("Из-за моего опыта меня казнили")
        
    def test_demo3(self):
        print("Я не пропустил условие, поэтому меня казнили")

Pytest методы до и после

Для начала нам нужно понять, что такое префикс и постфикс:

  • Предварительная и постобработка заключается в инкапсуляции и выполнении шагов, которые необходимо выполнить до и после выполнения методов разных уровней.
  • Этот уровень обычно делится на: уровень файла, уровень класса, уровень метода.

Во-первых, давайте представим, как Pytest реализует предварительную и постобработку через прошивку:

Язык кода:javascript
копировать
# Обычно мы используем предварительную и постобработку для выполнения операций до и после некоторых методов.
# Если мы используем слой метода до и после, то он будет выполнять содержимое до и после выполнения каждого метода.
# Если мы используем пре- и постобработку слоя класса, то он будет выполнять контент до и после вызова всех методов этого класса, но независимо от того, сколько раз будет выполняться метод этого класса, он будет вызываться только один раз.
# Например, когда мы выполняем тест входа в систему, нам нужно открыть браузер только один раз, когда тест начинается, а затем закрыть браузер один раз, когда тест заканчивается, затем мы используем префикс и постфикс класса.
# При входе в систему, чтобы гарантировать, что предварительная операция не повлияет на последующий Case, мы открываем веб-страницу перед выполнением метода, закрываем веб-страницу после выполнения метода и используем предварительную и постобработку метод.

# Прошивка Pytest спереди и сзади на самом деле в основном такая же, как и у unittest.
# Первый — это предварительная и постобработка прошивки на уровне метода.
# Это есть в каждом тестовом методе (код варианта использования). Структура, которая автоматически вызывается до и после выполнения.
# перед выполнением метода
	def setUp(self):
		Каждый тестперед выполнением метод будет выполнен
		pass
# После выполнения метода
	def tearDown(self):
		каждыйтест После выполнения метод будет выполнен
		pass
    
# Потом есть прошивка классового уровня спереди и сзади
# Это до и после выполнения всех методов в каждом тестовом классе. Структура, которая будет автоматически вызываться (выполняться один раз до или после выполнения во всем классе)
# Нужно обратить внимание на: класс прошивки до и после, это метод класса
# перед всеми методами в классе
    @classmethod
    def setUpClass(cls):
    	pass
# Ведь все методы в классе
	@classmethod
	def tearDownClass(cls):
		pass
    
# Наконец, есть прошивка на уровне модуля спереди и сзади.
# Структура кода, выполняемая до и после выполнения каждого файла кода
# Следует отметить, что уровень модуля необходимо писать вне класса, а функцию можно определить напрямую.
# перед файлом кода
	def setUpModule():
		pass
# после файла кода
	def tearDownModule():
		pass
    
# Ниже мы используем вариант использования входа в учетную запись пользователя, чтобы кратко продемонстрировать прошивку до и после.

import unittest

class TestLogin(unittest.TestCase):
    
    # Методы, которые необходимо вызвать перед выполнением этого класса
    @classmethod
    def setUpClass(cls) -> None:
    	print('------Открыть браузер')
    
    # Методы, которые необходимо вызвать после выполнения этого класса
    @classmethod
    def tearDownClass(cls) -> None:
    	print('------Закрыть браузер')
    
    # Каждый тестперед выполнением Метод, который метод вызовет первым
    def setUp(self):
    	print('Введите URL...')
    
    # каждыйтест После выполнения Методы, которые будут вызываться методом
    def tearDown(self) -> None:
    	print('Закрыть текущую страницу...')
    
    # тестCase1
    def test_1(self):
    	print('Введите правильное имя пользователя и код проверки пароля, нажмите, чтобы войти 1')
  
	# тестCase2
    def test_2(self):
    	print('Введите неправильное имя пользователя и код проверки пароля, нажмите, чтобы войти 2')

Затем нам также нужно объяснить, как Fixtrue реализует предварительное и последующее исправление:

Язык кода:javascript
копировать
# Прежде всего, нам нужно знать, что функции, реализованные в Fixtrue, по сути, такие же, как и в прошивке, но они будут более удобными.
# Сначала мы приводим полный формат Fixture, а затем вводим каждый параметр отдельно.
@pytest.fixture(scope=None,autouse=False,params=None,ids=None ,name=None)

# объем: объем
# Существует три основных типа параметров: функция, класс и пакет/пакет сеанса.

# функция: выполнять предварительную и постобработку на функциональном уровне
# Обычно мы используем выход для разделения передней и задней частей. До выхода это передняя часть, а после выхода — пост-раздел.
	@pytest.fixture(scope="function")
	def exe_database_sql():
		print("Выполнить SQL-запрос")
		yield
		print("Закрыть соединение с базой данных")
# Мы также можем использовать выход или возврат, чтобы вернуть некоторые параметры для использования в методах.
# Однако следует отметить, что пост-операция все еще может быть выполнена после того, как доходность возвращает параметр, но пост-операция не может быть выполнена после того, как return возвращает параметр.
	@pytest.fixture(scope="function")
	def exe_database_sql():
		print("Выполнить SQL-запрос")
		yield "success"
      # return "success" Почтовые операции не могут быть выполнены после выполнения
		print("Закрыть соединение с базой данных")
# Когда вызывается наш метод, мы можем напрямую использовать exe_database_sql для представления возвращаемой информации для вывода.
def test_2(self,exe_database_sql):
    	print(exe_database_sql)
        
# класс: выполняется до и после класса
	@pytest.fixture(scope="class")
	def exe_database_sql():
		print("Выполнить SQL-запрос")
		yield
		print("Закрыть соединение с базой данных")
        
# пакет/сеанс: выполняется до и после всего сеанса проекта
	@pytest.fixture(scope="session")
	def exe_database_sql():
		print("Выполнить SQL-запрос")
		yield
		print("Закрыть соединение с базой данных")

        
# autouse: запускать ли автоматически
# По умолчанию этот параметр имеет значение False, мы можем изменить его на True.
# Функция этого параметра заключается главным образом в том, чтобы определить, может ли прошивка автоматически запускаться в пределах пользовательского диапазона.
# Если он запускается автоматически, все методы будут автоматически выполнять префикс и префикс при выполнении, но если он имеет значение False, нам нужно запустить его вручную;

# Прежде всего, если он запускается автоматически, нам не нужно заботиться ни о каких параметрах, все наши методы будут вызываться автоматически.
	@pytest.fixture(scope="function",autoues=True)
	def exe_database_sql():
		print("Выполнить SQL-запрос")
		yield
		print("Закрыть соединение с базой данных")
        
# Но если автоматический запуск отключен, у нас будут разные методы вызова в разных областях.
	@pytest.fixture(scope="function",autoues=Flase)
	def exe_database_sql():
		print("Выполнить SQL-запрос")
		yield
		print("Закрыть соединение с базой данных")
        
# scope = функция: нам нужно добавить имя метода Fixture после метода
	def test_2(self,exe_database_sql):
    	print(exe_database_sql)
        
# scope = class: нам нужно добавить вызов декоратора @pytest.mark.usefixtures("exe_database_sql") к соответствующему классу.
@pytest.mark.usefixtures("exe_database_sql")
class TestDemo:
    pass

# scope = session:. Обычно реализуется в сочетании с файлом conftest.py, мы представим его позже.

# Также следует отметить, что autoouse ограничен использованием вышеуказанных методов в своем собственном классе. Если вы хотите использовать его в разных классах, нам также необходимо настроить его в conftest.py.


# params: реализовать параметризованную конфигурацию
# Обычно наши скрипты заполняют атрибуты на основе экспортированного файла yaml. О параметризации мы поговорим позже. Сначала мы параметризуем Fixture.
# За параметрами обычно следуют конкретные данные (список, кортеж и т. д.), а затем у нас есть фиксированный способ записи при вызове.
# Сначала нам нужно определить запрос в параметре метода Fixture, а затем использовать request.param для использования переданных нами данных параметров.
class TestDemo:
    def read_yaml():
        return ["грецкий орех", "ореховый малыш", "ореховый шеф-повар"]
    
    # Во-первых, нашим параметрам необходимо получить данные: params=read_yaml()
    @pytest.fixture(scope="function",autouse=False,params=read_yaml())
    # Тогда нашему методу Fixture требуется параметр запроса
	def exe_database_sql(request):
        print("Выполнить SQL-запрос")
        # Мы получаем данные через request.param и можем использовать выход для возврата данных.
        yield request.param
        print("Закрыть соединение с базой данных")
        

# ids: идентификатор псевдонима параметра
# Его нельзя использовать отдельно. Его следует использовать вместе с параметрами. Его функция — создание псевдонимов для параметров. 
# Когда мы используем pytest для вывода тестовых данных, соответствующий метод будет вызываться n раз. Эти идентификаторы предназначены для изменения консоли консоли для отображения данных.
class TestDemo:
    def read_yaml():
        return ["грецкий орех", "ореховый малыш", "ореховый шеф-повар"]
    
    # когда мы пишемids,Наш контрольный выход больше не будет таким, как указано выше ["грецкий орех", "ореховый малыш", "ореховый шеф-повар"],Это то, что мы написали ["1","2","3"]
    @pytest.fixture(scope="function",autouse=False,params=read_yaml(),ids=["1","2","3"])
	def exe_database_sql(request):
        print("Выполнить SQL-запрос")
        # Мы получаем данные через request.param и можем использовать выход для возврата данных.
        yield request.param
        print("Закрыть соединение с базой данных")
        
# имя: псевдоним прибора
# Функция состоит в том, чтобы присвоить fixtrue псевдоним. После использования псевдонима имя fixtrue больше нельзя использовать. Можно использовать только псевдонимы.
class TestDemo:
    
    # Если мы используем здесь псевдонимы
    @pytest.fixture(scope="function",name="exe_datebase_sql_name")
	def exe_database_sql(request):
        print("Выполнить SQL-запрос")
        yield 
        print("Закрыть соединение с базой данных")
        
    # Для работы нам необходимо использовать псевдонимы. Предыдущие имена использовать нельзя.
	def test_2(self,exe_datebase_sql_name):
    	print(exe_database_sql)    

Далее мы объясним только что упомянутый файл conftest.py:

Язык кода:javascript
копировать
# Для начала нам нужно знать, что имя файла conftest.py имеет фиксированную форму и не может быть изменено.
# Файл conftest.py в основном используется для хранения нашего Fixture, а затем мы будем оценивать методы, которые можно использовать, на основе различных местоположений файла.
# conftest можно создавать на разных уровнях каталогов. Если мы создадим его в корневом каталоге, во всех случаях будет использоваться это исправление.
# Но если мы создадим conftest.py в файле модуля в папке тестовых случаев, его область действия будет включена только в этот каталог.

# conftest.py создан в корневом каталоге
# Все фикстуры, которые мы написали в файле conftest в этом каталоге, могут быть выполнены в любом тестовом классе.
import pytest
@pytest.fixture(scope="function",name="exe_datebase_sql_name")
def exe_database_sql():
    print("Все методы могут быть выполнены перед запуском")
    yield 
    print("Все методы могут быть выполнены после запуска")
# Все тестовые классы в файле тестовых примеров
# Здесь следует отметить: когда мы используем Fixture в режиме conftest, мы можем использовать его без импорта пакета импорта.
import pytest
class TestDemo1:
	# тестCase1
    def test_1(self,exe_datebase_sql_name):
    	print('Введите правильное имя пользователя и код проверки пароля, нажмите, чтобы войти 1' + exe_datebase_sql_name)
        
# conftest.py создан в папке usercases в папке testcases.
# Все фикстуры, записанные в файле conftest, который мы создали в этом каталоге, могут использоваться только в тестовом классе в этом каталоге. Если они используются в других тестовых классах, произойдет ошибка.
import pytest
@pytest.fixture(scope="function",name="usercases_fixture")
def exe_database_sql():
    print("Метод usercases может быть выполнен перед запуском")
    yield 
    print("Метод usercases может быть выполнен после запуска")
# класс теста в папке пользовательских случаев в файле тестовых случаев
import pytest
class TestUserCases1:
	# тестCase1
    def test_1(self,usercases_fixture):
    	print('Введите правильное имя пользователя и код проверки пароля, нажмите, чтобы войти 1' + usercases_fixture)
        
# Наконец, мы просто задаем приоритет порядка до и после выполнения:
fixture_session > fixture_class > setup_class > fixture_function > setup

Затем, наконец, мы приводим общую логическую последовательность действий до и после выполнения:

  • Запросите файл conftest.py в текущем каталоге.
  • Запросите файл pytest.ini в текущем каталоге и найдите местоположение тестового варианта использования.
  • Запросите файл conftest.py в каталоге вариантов использования.
  • Запросить, есть ли в файле py тестового варианта использования настройки, Teardown, setup_class, Teardown_class.
  • Затем найдите вариант использования и выполните его в соответствии с правилами тестового варианта использования в файле pytest.ini.

Расширенный контент Pytest

Наконец, давайте объясним некоторые наиболее важные расширенные аспекты pytest.

Украшение с эффектом очарования

Страницы, которые мы генерируем с помощью Pytest, часто недостаточно красивы, а отображаемая информация беспорядочна и сложна для анализа, поэтому мы обычно используем allure для украшения интерфейса:

  • Allureramka — это гибкий и легкий многоязычный инструмент для создания отчетов о тестировании.
  • Он может не только отображать результаты тестирования в веб-формате.,Это также позволяет всем, кто участвует в процессе разработки, максимально извлекать полезную информацию из ежедневного выполнения задач.

Давайте узнаем, как установить и использовать allure:

Язык кода:javascript
копировать
# Сначала нам нужно скачать allure на компьютер и настроить переменные среды.
# Здесь мы указываем официальный адрес для загрузки с сайта: https://github.com/allure-framework/allure2/releases. 
# Напоминание: ссылка для скачивания находится на github. Если ее не удается открыть, вы можете обновить и повторить попытку или использовать вспомогательные инструменты, такие как лестницы ускорителей.
# Чтобы настроить переменные среды, вам нужно всего лишь поместить каталог, в котором находится bin-файл, в путь компьютера, который здесь не будет показан.

# На втором этапе нам нужно загрузить плагин allure-pytest на pycharm (если вы ранее копировали весь файл, его нужно было скачать здесь)
pip install allure-pytest

# На третьем этапе мы можем напрямую сгенерировать интерфейс отображения результатов теста Allure.

# 1. Обычно сначала нам нужно создать временный файл Json.
# Обычно мы добавляем строку типа «‐alluredir=./temps ‐‐clean‐alluredir"
# ‐‐alluredir = Адрес создания файла : Указывает, что мы будем создавать временные файлы Allure в указанном нами относительном временном каталоге.
# ‐‐clean‐alluredir : Поскольку каждый раз будет создаваться большое количество файлов, мы очистим все файлы в текущем каталоге перед созданием, чтобы гарантировать, что наши данные являются самыми последними.

# 2. Нам нужно использовать временные файлы для создания веб-страницы allure.html.
# Обычно мы выполняем его в основном методе
if __name__ == '__main__':
    # нормальная работа
    pytest.main()
    # Спящий режим: в основном для создания временных файлов JSON.
    time.sleep(3)
    # allure generate фиксированное заявление + каталог временных файлов JSON allure + -o Инструкции вывода + allure.html сгенерированный каталог файлов + --clean Очистить старые данные
    os.system("allure generate ./temps ‐o ./reports ‐‐clean")

Параметризация на основе данных

Обычно мы используем аннотации Parameterize для управления данными. Давайте подробно объясним это ниже:

Язык кода:javascript
копировать
# Формат: @pytest.mark.parametrize(имя параметра, значение параметра)
# Значение: мы будем использовать имя параметра в качестве идентификатора, а затем вызывать его последовательно в соответствии с количеством значений параметра. Если имеется n значений параметра, мы вызовем этот случай n раз.

# 1. Если значение параметра представляет собой список или кортеж, имя параметра может быть одним.
# Прежде всего, поскольку здесь мы используем список (кортеж) из одного элемента, имя нашего параметра может быть
@pytest.mark.parameterize('caseinfo',['грецкий орех','ореховый малыш','Фуфу','Фуфу детка'])
# В параметрах метода нам нужно вызвать имя параметра caseinfo параметраparameterize, которое должно быть точно таким же.
def test_01_get_token(self,caseinfo):
    # Здесь мы можем использовать имя параметра caseinfo для замены элементов в списке.
    # В списке их несколько, и наш метод будет выполняться несколько раз. Например, если в списке четыре элемента, то наш метод будет выполняться четыре раза, и каждый раз разные элементы будут присваиваться по порядку.
	print("Получить код аутентификации единого интерфейса:"+caseinfo)
    
# 2. Если значение параметра в списке несколько, имя параметра может быть несколькими.
# Здесь у нас есть список, вложенный в список. Если мы используем одно имя параметра, то будет выведен первый список ['Walnut Kitchen', 'Walnut Baby'].
# Но если у нас многопараметрическое имя, система автоматически присвоит элементы первого списка arg1 отдельно, нам удобно использовать его отдельно.
@pytest.mark.parameterize('arg1,arg2',[['ореховая кухня','ореховый малыш'],['фуфу кухня','фуфу детка']])
# Примечание. Разумеется, оно также должно соответствовать имени параметра! ! !
def test_01_get_token(self,arg1,arg2):
	print("Получить код аутентификации единого интерфейса: "+str(arg1)+" "+str(arg2))

Когда мы управляем данными, мы обычно объединяем файлы Yaml для получения данных. Здесь мы кратко представляем файлы Yaml:

Язык кода:javascript
копировать
# yaml — формат данных, расширение может быть yaml, yml
# Поддерживает # комментариев, указывающих уровни посредством отступов, с учетом регистра, а окончательный результат отображения файла yaml представляет собой формат списка словарей.
# Файлы Yaml часто используются для записи конфигураций, например, файлы конфигурации в Java Spring, и мы также часто используем yaml для записи Автоматизированного тестированиевариант использования

# Файлы Yaml обычно существуют в двух форматах.

# Формат словаря: если мы пишем файл yaml в обычном режиме, следующий режим словаря:
name: грецкий орех

# Режим списка: если мы возьмем список из yaml, мы также получим список, когда его получит py.
msjy:
    - name1: грецкий орех
    - name2: Фуфу
    - ages1: 18
    - ages2: 19
# Мы также можем использовать эту функцию для создания нескольких списков непосредственно в yaml для многократного извлечения.
-
	name:'xxx'
    age:18
-
	name:'xxx'
    age:20

# Здесь мы сначала приведем пример функции для анализа файлов yaml:
import os.path
import yaml

# Вот чтобы получить текущий путь, потому что нам нужно найти соответствующий файл yaml, тогда конкретный путь требует, чтобы мы его соединили.
def get_obj_path():
    # Здесь мы используем класс Python os для получения текущего пути, а конечный возвращаемый результат на самом деле является строкой String.
    # Мы используем «common» в качестве разграничения (common — это имя текущей папки, мы разделяем Str и получаем предыдущую часть) и получаем предыдущую часть пути для сращивания.
    return os.path.dirname(__file__).split('common')[0]

# Затем мы определяем здесь метод для анализа файла yaml.
def read_yaml(yamlPath):
    with open(get_obj_path() + yamlPath,mode = 'r',encoding = 'utf-8') as f:
        # Нам нужен пип здесь install pyyaml
        value = yaml.load(steam=f,Loader=yaml.FullLoader)
        return value
    
# Затем мы используем здесь основной метод для выполнения описанного выше варианта использования (на самом деле он должен выполняться в других тестовых классах)
if __name__ = '__main__':
    # Вызовите метод read_yaml и укажите путь yaml.
    print(read_yaml('testcase/user_manage/get_token.yaml'))

# Прежде чем мы все поймем, мы можем объединить его с предыдущим параметризацией для работы:
# Здесь мы меняем необходимые данные на содержимое yaml-файла, читаемого read_yaml.
@pytest.mark.parametrize('caseinfo',read_yaml('testcase/user_manage/get_token.yaml'))
def test_01_get_token(self,caseinfo):
    # Здесь мы можем получить содержимое файла yaml и вывести его.
	print("Получить код аутентификации единого интерфейса:"+caseinfo)
    
# Конечно, если мы знаем, какие элементы есть в нашем yaml, мы также можем использовать [], чтобы выразить это конкретно.
@pytest.mark.parametrize('caseinfo',read_yaml('testcase/user_manage/get_token.yaml'))
def test_01_get_token(self,caseinfo):
	print("Получить код аутентификации единого интерфейса:")
    # Здесь мы можем напрямую получить значение, соответствующее namekey
    print("caseinfo[name]:"+ caseinfo['name'])
    # Здесь мы можем получить значения, соответствующие методу, URL-адресу и данным на уровне запроса.
    print("caseinfo[name]:"+ caseinfo['request']['method'])
    print("caseinfo[name]:"+ caseinfo['request']['url'])
    print("caseinfo[name]:"+ caseinfo['request']['data'])

Ссылка: https://www.cnblogs.com/qiuluoyuweiliang/p/17828833.html.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose