Задачки для начинающих автоматизаторов тестирования

79b8fad14cfb45c738e4ed43c59c1b31.jpg

Привет, друзья! В этой статье предлагаем вам решить десяток задач, написав код на Python и тесты с использованием pytest. К каждой задаче приложили наш вариант решения. Дисклеймер: наш вариант не обязательно самый лучший и уж точно не единственно верный, но рабочий.

Задача 1. Подсчет суммы чисел от 1 до N

Напишите функцию calculate_sum, которая принимает на вход одно целочисленное значение N и возвращает сумму всех чисел от 1 до N включительно.

Требования к тестам с использованием pytest:

  • Напишите тесты для функции calculate_sum с различными значениями N, включая положительные и отрицательные числа, а также нуль.

  • Убедитесь, что функция возвращает корректную сумму для всех входных данных.

Наше решение:

Hidden text

# sum_of_numbers.py
def calculate_sum(N):
    return sum(range(1, N + 1))

# test_sum_of_numbers.py
import pytest
from sum_of_numbers import calculate_sum

def test_calculate_sum_positive():
    assert calculate_sum(5) == 15

def test_calculate_sum_negative():
    assert calculate_sum(-5) == 0

def test_calculate_sum_zero():
    assert calculate_sum(0) == 0

def test_calculate_sum_large():
    assert calculate_sum(100) == 5050

Здесь функция calculate_sum принимает число N, затем использует функции sum и range для подсчета суммы чисел от 1 до N. Тесты проверяют правильность работы функции для различных входных данных.

Задача 2. Подсчет суммы четных чисел

Напишите функцию calculate_even_sum, которая принимает на вход список чисел и возвращает сумму всех четных чисел в этом списке.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# calculate_even_sum.py
def calculate_even_sum(numbers):
    return sum(num for num in numbers if num % 2 == 0)

# test_calculate_even_sum.py
import pytest
from calculate_even_sum import calculate_even_sum

def test_positive_numbers():
    assert calculate_even_sum([1, 2, 3, 4, 5]) == 6
    assert calculate_even_sum([10, 20, 30, 40, 50]) == 150

def test_negative_numbers():
    assert calculate_even_sum([-1, -2, -3, -4, -5]) == -6
    assert calculate_even_sum([-10, -20, -30, -40, -50]) == -150

def test_mixed_numbers():
    assert calculate_even_sum([-5, 10, -3, 8, 2]) == 20
    assert calculate_even_sum([0, 0, 0, 0, 0]) == 0

def test_empty_list():
    assert calculate_even_sum([]) == 0

def test_no_even_numbers():
    assert calculate_even_sum([1, 3, 5, 7, 9]) == 0

Здесь функция calculate_even_sum принимает список целых чисел и возвращает сумму только четных чисел, проверяя для этого элементы списка на четность. Тесты проверяют правильность работы функции для различных входных данных.

Задача 3. Разделение на подсписки

Напишите функцию split_into_sublists, которая принимает на вход список элементов и число chunk_size, и возвращает список из подсписков, каждый размером chunk_size. Если в конце остается менее chunk_size элементов, они также должны быть включены в последний подсписок.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# split_into_sublists.py
def split_into_sublists(input_list, chunk_size):
    return [input_list[i:i+chunk_size] for i in range(0, len(input_list), chunk_size)]

# test_split_into_sublists.py
import pytest
from split_into_sublists import split_into_sublists

def test_regular_list():
    assert split_into_sublists([1, 2, 3, 4, 5, 6, 7], 3) == [[1, 2, 3], [4, 5, 6], [7]]
    assert split_into_sublists(["a", "b", "c", "d", "e", "f"], 2) == [["a", "b"], ["c", "d"], ["e", "f"]]

def test_empty_list():
    assert split_into_sublists([], 3) == []

def test_chunk_size_greater_than_list_length():
    assert split_into_sublists([1, 2, 3], 5) == [[1, 2, 3]]

def test_chunk_size_equal_to_list_length():
    assert split_into_sublists(["apple", "banana", "cherry"], 3) == [["apple", "banana", "cherry"]]

def test_mixed_elements():
    assert split_into_sublists([1, "a", 2, "b", 3, "c"], 2) == [[1, "a"], [2, "b"], [3, "c"]]

Здесь функция split_into_sublists принимает на вход список элементов и число, которое определяет размер подсписков. Возвращает она список, состоящий из подсписков заданного размера.

При реализации используется взятие срезов входящего списка. Тесты проверяют правильность работы функции для различных входных данных.

Задача 4. Подсчет слов в предложении

Напишите функцию count_words, которая принимает на вход строку, представляющую предложение, и возвращает количество слов в этом предложении. Предполагается, что слова разделены пробелами.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# count_words.py
def count_words(sentence):
    return len(sentence.split())

# test_count_words.py
import pytest
from count_words import count_words

def test_regular_sentence():
    assert count_words("This is a test sentence.") == 5
    assert count_words("Python programming is fun!") == 4

def test_empty_sentence():
    assert count_words("") == 0

def test_sentence_with_whitespace():
    assert count_words("     ") == 0
    assert count_words("  Word  spacing   test  ") == 3

def test_sentence_with_numbers():
    assert count_words("There are 123 numbers.") == 4
    assert count_words("This sentence has 7 words.") == 5

В данном примере функция count_words принимает на вход строку и преобразует ее в список, разбивая по пробелам. Далее она выводит число элементов данного списка, то есть число слов во входной строке. Тесты проверяют правильность работы функции для различных входных данных.

Задача 5. Поиск уникальных элементов

Напишите функцию find_unique, которая принимает на вход список элементов и возвращает список из элементов, которые встречаются в исходном списке только один раз.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# find_unique.py
def find_unique(elements):
    return [element for element in elements if elements.count(element) == 1]

# test_find_unique.py
import pytest
from find_unique import find_unique

def test_unique_elements():
    assert find_unique([1, 2, 3, 4, 5]) == [1, 2, 3, 4, 5]
    assert find_unique(['a', 'b', 'c', 'd']) == ['a', 'b', 'c', 'd']

def test_duplicate_elements():
    assert find_unique([1, 2, 2, 3, 4, 4, 5]) == [1, 3, 5]
    assert find_unique(['a', 'b', 'b', 'c', 'c', 'd']) == ['a', 'd']

def test_mixed_elements():
    assert find_unique([1, 'a', 2, 'b', 3, 'c']) == [1, 'a', 2, 'b', 3, 'c']

def test_empty_list():
    assert find_unique([]) == []

Функция find_unique принимает список произвольных элементов и возвращает его, проверяя при этом, чтобы элемент в списке не имел дубликатов. В противном случае этот элемент в возвращаемый список не включается. Тесты проверяют правильность работы функции для различных входных данных.

Задача 6. Число-палиндром

Напишите функцию is_palindrome, которая принимает на вход число и проверяет, является ли оно палиндромом. Палиндромом называется число, которое одинаково читается слева направо и справа налево.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# is_palindrome.py
def is_palindrome(number):
    number_str = str(number)
    return number_str == number_str[::-1]

# test_is_palindrome.py
import pytest

from palindrome import is_palindrome

def test_positive_palindrome():
    assert is_palindrome(121) == True
    assert is_palindrome(1221) == True

def test_negative_palindrome():
    assert is_palindrome(123) == False
    assert is_palindrome(12321) == False

def test_single_digit():
    assert is_palindrome(9) == True

def test_negative_number():
    assert is_palindrome(-121) == False

def test_large_palindrome():
    assert is_palindrome(12345678987654321) == True

def test_empty_input():
    with pytest.raises(ValueError):
        is_palindrome('')

def test_string_input():
    with pytest.raises(ValueError):
        is_palindrome('hello')

def test_float_input():
    with pytest.raises(ValueError):
        is_palindrome(12.21)

Здесь функция is_palindrom принимает число, преобразует его в строку и далее сравнивает эту строку с этой же строкой, но записанной в обратном порядке. Если они равны, возвращается True, в противном случае False. Тесты проверяют правильность работы функции для различных входных данных.

Задача 7. Поиск наименьшего простого делителя

Напишите функцию smallest_prime_divisor, которая принимает на вход положительное целое число n и возвращает наименьший простой делитель этого числа (кроме 1). Если n само является простым числом, функция должна вернуть само n.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# smallest_prime_divisor.py
def smallest_prime_divisor(n):
    if n == 2:
        return 2
    for divisor in range(2, int(n ** 0.5) + 1):
        if n % divisor == 0:
            return divisor
    return n

# test_smallest_prime_divisor.py
import pytest
from smallest_prime_divisor import smallest_prime_divisor

def test_prime_numbers():
    assert smallest_prime_divisor(2) == 2
    assert smallest_prime_divisor(3) == 3
    assert smallest_prime_divisor(17) == 17
    assert smallest_prime_divisor(19) == 19

def test_composite_numbers():
    assert smallest_prime_divisor(4) == 2
    assert smallest_prime_divisor(9) == 3
    assert smallest_prime_divisor(25) == 5
    assert smallest_prime_divisor(35) == 5

def test_large_number():
    assert smallest_prime_divisor(1000000007) == 1000000007

def test_smallest_prime_divisor_of_1():
    assert smallest_prime_divisor(1) == 1

Здесь функция smallest_prime_divisor принимает на вход целое число и методом перебора находит минимальный делитель. Тесты проверяют правильность работы функции для различных входных данных.

Задача 8. Проверка анаграмм

Напишите функцию are_anagrams, которая принимает на вход две строки и возвращает True, если они являются анаграммами, и False в противном случае. Анаграммами называются строки, которые содержат одни и те же буквы, но в разном порядке.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# are_anagrams.py
def are_anagrams(str1, str2):
    return sorted(str1) == sorted(str2)

# test_are_anagrams.py
import pytest
from are_anagrams import are_anagrams

def test_anagrams():
    assert are_anagrams("listen", "silent")
    assert are_anagrams("triangle", "integral")
    assert are_anagrams("debit card", "bad credit")

def test_not_anagrams():
    assert not are_anagrams("hello", "world")
    assert not are_anagrams("python", "java")
    assert not are_anagrams("abc", "def")

def test_empty_strings():
    assert are_anagrams("", "")

def test_different_lengths():
    assert not are_anagrams("abc", "abcd")
    assert not are_anagrams("abc", "ab")

Функция are_anagrams () принимает на вход две строку, затем сортирует их и сравнивает между собой. Если результат True, то строки являются анаграммами. Тесты проверяют правильность работы функции для различных входных данных.

Задача 9. Объединение списков

Напишите функцию combine_lists, которая принимает на вход два списка и возвращает новый список, содержащий все элементы из обоих входных списков, сохраняя порядок их следования.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# combine_lists.py
def combine_lists(list1, list2):
    return list1 + list2

# test_combine_lists.py
import pytest
from combine_lists import combine_lists

def test_regular_lists():
    assert combine_lists([1, 2, 3], [4, 5, 6]) == [1, 2, 3, 4, 5, 6]
    assert combine_lists(["apple", "banana"], ["cherry", "date"]) == ["apple", "banana", "cherry", "date"]

def test_empty_lists():
    assert combine_lists([], []) == []

def test_one_empty_list():
    assert combine_lists([], ["a", "b", "c"]) == ["a", "b", "c"]
    assert combine_lists(["x", "y", "z"], []) == ["x", "y", "z"]

def test_mixed_elements():
    assert combine_lists([1, "a", 2], ["b", 3, "c"]) == [1, "a", 2, "b", 3, "c"]

Функция combine_lists () принимает на вход два списка и объединяет их при помощи операции сложения списков. Тесты проверяют правильность работы функции для различных входных данных.

Задача 10. Подсчет гласных букв

Напишите функцию count_vowels, которая принимает на вход строку, состоящую из латинских букв, и возвращает количество гласных букв (а именно буквы A, E, I, O, U, a, e, i, o, u) в этой строке.

Напишите также тесты с использованием pytest, чтобы проверить правильность работы функции на разных входных данных.

Наше решение:

Hidden text

# count_vowels.py
def count_vowels(input_string):
    vowels = "AEIOUaeiou"
    return sum(1 for char in input_string if char in vowels)

# test_count_vowels.py
import pytest
from count_vowels import count_vowels

def test_regular_string():
    assert count_vowels("hello") == 2
    assert count_vowels("python") == 1

def test_empty_string():
    assert count_vowels("") == 0

def test_string_with_no_vowels():
    assert count_vowels("xyz") == 0
    assert count_vowels("bcdfghjklmnpqrstvwxyz") == 0

def test_string_with_all_vowels():
    assert count_vowels("AEIOUaeiou") == 10

def test_mixed_string():
    assert count_vowels("Hello World") == 3
    assert count_vowels("Programming is fun!") == 6

Функция count_vowels принимает на вход строку, состоящую из латинских букв и возвращает количество гласных букв в данной строке. Подсчет гласных осуществляется посредством проверки вхождения каждого символа в строку, в содержащую все гласные буквы. Тесты проверяют правильность работы функции для различных входных данных.

Вот и всё. Напишите в комментариях ваши замечания и предложения с указанием номера задачи.

© Habrahabr.ru