Advertisement
fkudinov

Testing Challenge

Sep 7th, 2024 (edited)
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.24 KB | Source Code | 0 0
  1. """
  2. Покрийте тестами запропоновані функції
  3. Не забувайте використовувати техніки тест дизайну
  4.  
  5. Очікувана структура проекту:
  6.  
  7. + tasks
  8.  |_ __init__.py
  9.  |_ not_reliable_function_1.py
  10.  |_ not_reliable_function_2.py
  11.  |_ retry_tool.py
  12.  |_ get_connection.py
  13.  
  14. + tests
  15.  |_ __init__.py
  16.  |_ test_not_reliable_function_1.py
  17.  |_ test_not_reliable_function_2.py
  18.  |_ test_retry_tool.py
  19.  |_ test_get_connection.py
  20.  
  21.  
  22. Очікується, що жодні зміни не будуть внесені у файли у папці tasks
  23. """
  24.  
  25.  
  26.  
  27. # ----------- tasks/not_reliable_function_1.py ------------------
  28.  
  29. """
  30. В цьому випадку random.choice є ненадійним компонентом
  31. адже результат його роботи непередбачуваний.
  32. Потрібно написати надійні тести
  33. які б перевіряли логіку роботи функції not_reliable
  34.  
  35. Важливо перевірити як positive так і negative сценарії
  36. """
  37.  
  38.  
  39. import random
  40.  
  41.  
  42. def not_reliable():
  43.     data = random.choice(range(10))
  44.     if data < 5:
  45.         raise ValueError
  46.     return data
  47.  
  48. # ---------------- tasks/not_reliable_function_2.py ------------------
  49.  
  50. """
  51. Задача схожа на попередню,
  52. але імпорт та використання функції choice виконаний трохи поіншому
  53. """
  54.  
  55.  
  56. from random import choice
  57.  
  58.  
  59. def not_reliable():
  60.     data = choice(range(10))
  61.     if data < 5:
  62.         raise ValueError
  63.     return data
  64.  
  65.  
  66.  
  67.  
  68. # -------------   tasks/retry_tool.py --------------
  69. """
  70. Необхідно протестувати декоратор,
  71. який дозволяє робити повторні виклики у задекоровану фукнцію
  72. у випадку якщо сталася помилка при її виклику.
  73. """
  74.  
  75. def retry(times: int = 0):
  76.     """
  77.    Параметризований декоратор,
  78.    дозволяє зробити повторний виклик задекорованої функції
  79.    якщо при її виклику сталася помилка,
  80.  
  81.    :param times: дозволяє вказати кількість очікуваних повторів,
  82.                  по замовчуванню необмежена кількість повторів
  83.    """
  84.     def decorator(func):
  85.         def wrapper(*args, **kwargs):
  86.             _times = times
  87.  
  88.             while True:
  89.                 try:
  90.                     return func(*args, **kwargs)
  91.                 except Exception as e:
  92.                     _times -= 1
  93.                     if _times == 0:
  94.                         raise e
  95.  
  96.         return wrapper
  97.     return decorator
  98.  
  99.  
  100. # Приклад використання
  101. # у вашому випадку, потрібно протестувати саме декоратор,
  102. # ви можете створити власну функцію безпосередньо у тесті
  103. # і задекорувати її декоратором.
  104.  
  105. if __name__ == '__main__':
  106.  
  107.     from random import choice
  108.  
  109.     @retry()
  110.     def not_reliable():
  111.         data = choice(range(10))
  112.         if data < 5:
  113.             raise ValueError
  114.         return data
  115.  
  116.     print(not_reliable())
  117.  
  118.     @retry(times=2)
  119.     def not_reliable():
  120.         data = choice(range(10))
  121.         if data < 5:
  122.             raise ValueError
  123.         return data
  124.  
  125.     print(not_reliable())
  126.    
  127.    
  128.    
  129.    
  130. # -------------------     tasks/get_connection.py    ------------------
  131.  
  132.  
  133. """
  134. В даному прикладі ми очікуємо змінні оточення USER та PASSWORD
  135. але вони можуть бути і не встановлені при локальному запуску тестів
  136.  
  137. та функцію get_connection всеодно треба якось протестувати
  138. """
  139.  
  140. import os
  141.  
  142.  
  143. USER = os.environ['LOGIN']
  144. PASSWORD = os.environ['PASSWORD']
  145.  
  146.  
  147. def get_connection():
  148.     if USER and PASSWORD:
  149.         print("Connection is successful")
  150.         return
  151.  
  152.     raise ConnectionError
  153.  
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement