lab7

parent 2c734d71
# Программирование Python лабораторная работа 7
## Задание 1
[ex1](./code/ex1/ex1.py)
[ex1 tests](./code/ex1/ex1_test.py)
## Задание 2
[ex2](./code/ex2/ex2.py)
[ex2 tests](./code/ex2/ex2_test.py)
## Задание 3
[ex3](./code/ex3/ex3.py)
[ex3 tests](./code/ex3/ex3_test.py)
import configparser
import os
def read_settings(filename='settings.ini'):
"""Считывает настройки из файла INI.
Args:
filename (str): Путь к файлу настроек.
Returns:
dict: Настройки в виде словаря.
Raises:
FileNotFoundError: Если файл не найден.
ValueError: Если файл содержит некорректный формат.
"""
if not os.path.exists(filename):
raise FileNotFoundError(f"File {filename} not found.")
config = configparser.ConfigParser()
try:
config.read(filename)
return {
'host': config['database']['host'],
'port': int(config['database']['port']),
'user': config['database']['user'],
'password': config['database']['password']
}
except Exception as e:
raise ValueError(f"Error parsing settings file: {e}")
def write_to_file(filename, line):
"""Записывает строку в файл. Создает файл, если он отсутствует.
Args:
filename (str): Имя файла.
line (str): Строка для записи.
"""
mode = 'a' if os.path.exists(filename) else 'w'
with open(filename, mode) as file:
file.write(line + '\n')
import unittest
import tempfile
import os
from ex1 import read_settings, write_to_file
class TestSettings(unittest.TestCase):
def setUp(self):
self.tempfile = tempfile.NamedTemporaryFile(delete=False)
with open(self.tempfile.name, 'w') as file:
file.write("[database]\nhost = localhost\nport = 3306\nuser = user\npassword = secret")
def tearDown(self):
os.remove(self.tempfile.name)
def test_read_settings(self):
settings = read_settings(self.tempfile.name)
self.assertEqual(settings['host'], 'localhost')
self.assertEqual(settings['port'], 3306)
self.assertEqual(settings['user'], 'user')
self.assertEqual(settings['password'], 'secret')
def test_file_not_found_error(self):
with self.assertRaises(FileNotFoundError):
read_settings('nonexistent.ini')
def test_value_error(self):
with open(self.tempfile.name, 'w') as file:
file.write("invalid content")
with self.assertRaises(ValueError):
read_settings(self.tempfile.name)
class TestFileWrite(unittest.TestCase):
def setUp(self):
self.tempfile = tempfile.NamedTemporaryFile(delete=False)
self.tempfile.close()
def tearDown(self):
os.remove(self.tempfile.name)
def test_write_to_file(self):
write_to_file(self.tempfile.name, "Hello")
with open(self.tempfile.name, 'r') as file:
content = file.read().strip()
self.assertEqual(content, "Hello")
def test_append_to_file(self):
write_to_file(self.tempfile.name, "First line")
write_to_file(self.tempfile.name, "Second line")
with open(self.tempfile.name, 'r') as file:
content = file.read().strip().split('\n')
self.assertEqual(content, ["First line", "Second line"])
def test_create_file_if_absent(self):
os.remove(self.tempfile.name) # Удаляем файл
write_to_file(self.tempfile.name, "New content")
with open(self.tempfile.name, 'r') as file:
content = file.read().strip()
self.assertEqual(content, "New content")
if __name__ == '__main__':
unittest.main()
import itertools
def two_sum(lst: list) -> tuple:
target = 8
result = None
for (i, val1), (j, val2) in itertools.combinations(enumerate(lst), 2):
if lst[i] + lst[j] == target and (i != j):
result = (i, j)
return tuple(sorted(result))
if result is None:
return None
return tuple(sorted(result))
import pytest
from ex2 import two_sum
@pytest.mark.parametrize(
"lst, expected_result",
[
([9, 1, 4, 1, 5, 10, 2, 9, 4], (2, 8)),
([1, 2, 3, 4, 5], (2, 4)),
([8, 0], (0, 1)),
([10 ** 9, -10 ** 9], None),
([10 ** 9, 10 ** 9 - 1, -10 ** 9], None),
([1, 1, 1, 1], None),
([5, 2, 2, 5, 4], None),
([5, 2, 3, 5, 4], (0, 2)),
([1, 7, 3, 5, 4], (0, 1)),
([], None),
]
)
def test_two_sum(lst, expected_result):
assert two_sum(lst) == expected_result
def factorial(n):
if not isinstance(n, int) or n < 0:
raise ValueError("n должно быть натуральным числом")
if n == 0 or n == 1:
return 1
return n * factorial(n - 1)
from hypothesis import given, strategies as st
import pytest
from ex3 import factorial
@given(st.integers(min_value=0, max_value=100))
def test_factorial_correctness(n):
if n == 0 or n == 1:
assert factorial(n) == 1
else:
result = factorial(n)
expected = 1
for i in range(1, n + 1):
expected *= i
assert result == expected
@given(st.integers(min_value=0, max_value=99))
def test_factorial_property(n):
"""Проверяет свойство факториала: (n + 1)! = (n + 1) * n!."""
assert factorial(n + 1) == (n + 1) * factorial(n)
@given(st.integers(min_value=0, max_value=100))
def test_factorial_non_negative(n):
"""Проверяет, что факториал всегда возвращает неотрицательное значение."""
assert factorial(n) >= 0
@given(st.one_of(st.floats(allow_nan=False, allow_infinity=False), st.integers(max_value=-1)))
def test_factorial_invalid_input(n):
"""Проверяет, что функция выбрасывает ValueError для некорректных входных данных."""
with pytest.raises(ValueError):
factorial(n)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment