Как проверить функцию, которая использует пользовательский интерфейс - PullRequest
0 голосов
/ 13 июня 2018

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

Вот пример, где мы просим пользователя выбрать элемент в списке (main.py):

import tkinter as tk
from tkinter import Button, OptionMenu, StringVar


def ask_for_item_in_list(lst, title, default_index=0):

    root, item = tk.Tk(), None
    WIDTH, HEIGHT = 300, 120

    root.title(title)

    root.maxsize(width=WIDTH, height=HEIGHT)
    root.minsize(width=WIDTH, height=HEIGHT)
    root.resizable(0, 0)

    variable = StringVar(root)
    variable.set(lst[default_index])

    option_menu = OptionMenu(root, variable, *lst)
    option_menu.pack(fill="none", expand=True)

    def on_close():
        # The window has been closed by the user
        variable.set(None)
        close()

    def close():
        # It quits mainloop()
        root.quit()
        # It closes the window
        root.destroy()

    button_ok = Button(root, text='OK', command=close)
    button_ok.pack(fill='none', expand=True)

    root.protocol('WM_DELETE_WINDOW', on_close)

    # Execution stops here as long as the user has not closed the window or
    # pressed ok
    root.mainloop()

    # We retrieve the selected item
    item = variable.get()
    if item == 'None':
        item = None

    return item

if __name__ == '__main__':
        lst = ['Item 1', 'Item 2', 'Item 3']
        title = 'Select an item'
        default_selected_idx = lst.index('Item 2')

        selected_item = ask_for_item_in_list(lst, title, default_selected_idx)

        print(selected_item)

Я использовал pytest чтобы написать все мои тесты, так как я не могу использовать объектно-ориентированное программирование.На самом деле, код должен обслуживаться людьми, которые не являются профессиональными разработчиками.

Как видите, я не могу протестировать эту функцию таким образом, так как она будет ждать ввода пользователя (test_main.py):

from main import ask_for_item_in_list


def test_ask_for_item_in_list():
    lst = ['Item 1', 'Item 2', 'Item 3']
    title = 'Select an item'

    # Here TRY to test if changing the default selected index works
    default_selected_idx = lst.index('Item 2')

    # Code to simualte that the user as clicked on OK ?
    # user.click_button('OK') ?
    selected_item = ask_for_item_in_list(lst, title, default_selected_idx)

    assert selected_item == 'Item 2'
  • Нужно ли мне изменить способ, которым я это кодировал?
  • Уместно ли тестировать этот тип функции?

Я сталкивался с этой проблемой много раз (независимо от используемого языка), я хотел бы знать, как это должно быть сделано чистым способом.

Спасибо за чтение!:)

1 Ответ

0 голосов
/ 13 июня 2018

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

В C ++ вы можете сделать что-то вроде:

int number_of_tests = 10;
int tests_passed = 0;
tests_passed += my_test_function_int(0);
tests_passed += my_test_function_int(-1);
...
tests_passed += my_test_function_string("foo");
tests_passed += my_test_function_string("");
tests_passed += my_test_function_string(" ");
...
return (tests_passed == number_of_tests); 

Это всего лишь пример того, как это можно сделать (в нашей компании мы это делаемпуть).Также не очень сложно добавлять новые тесты для непрограммистов или новых людей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...