iPython для "ручного" тестировщика-1


Для кого НЕ предназначены этот и будущие (надеюсь, что они будут) посты? Однозначно НЕ для программистов, не важно, пишут они на Python, или нет. Я сам не программист, я не знаю теории программирования (не то, чтобы я этим гордился, просто констатирую факт) и не собираюсь учить людей правильно писать код, я просто использую инструмент, чтобы сделать свою работу лучше, а сам процесс - удобнее для меня.

Для кого же они предназначены? Прежде всего - для людей, которые не боятся командной строки, которым набрать команду ls -ltr удобнее, чем открыть файловый менеджер. Но при этом они не умеют автоматизировать свои рабочие задачи, хотя и очень хотят :)
Зачастую это мои коллеги, т.н. "ручные" тестировщики (да-да, мы все не любим это деление, но можно сколько угодно отрицать явление - это не отменит его существование :) ). Вот они-то и являются моей ЦА, я хочу дать им инструмент для простой автоматизации повторяющихся заданий.

 Ещё до того, как я начал писать тесты на Python, я обнаружил для себя продвинутую командную строку ipython, которая позволяет создавать эдакие недоскрипты, писать набор команд не понимая почти ничего в программировании. Вот про ipython и возможности, которые он предоставляет я и попытаюсь рассказать. Конечно, придётся дать чуть-чуть информации по синтаксису языка. Зато потом работать станет гораздо удобнее и интереснее.

Итак, для начала нам нужно установить на компьютер python и ipython. Есть две версии Python: 2 и 3, они немного отличаются в синтаксисе (на самом деле не только, но это выходит за рамки сего опуса).
Я буду использовать 3-ю версию, просто потому, что так хочу.
Лично я для работу использую Debian (если у вас другая ОС - гугл в помощь. Практически на всех Linux-дистрибутивах python уже предустановлен, надо поставить только ipython, на других операционках - зависит от):
sudo apt install ipython3
И запускаем его:
user@testmachine:~$ ipython3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
Type "copyright", "credits" or "license" for more information.
IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
In [1]:
Вот мы и в "Хопре" :)
Давайте немного поиграем со строками. Строки - это важно. Зачастую есть необходимость найти и выделить какой-то элемент из тестовой строки, как-то его обработать, проверить, подходит ли он под какой-то критерий. В том же Linux для этого можно использовать, например, grep, cut, sed и awk с наборами хитрых ключей. В Python это будет выглядеть так:
In [1]: test_string = "Brace yourself, Python is coming"
Смысл этой строки простой: переменная test_string принимает значение  "Brace yourself, Python is coming" .

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

Что мы сделали? Мы создали объект типа строка. Нет, слишком страшно звучит, лучше так: мы определили новую строку. Со строками можно сделать различные операции. Их можно складывать, разбивать по какому-то критерию, модифицировать, сортировать и ещё много чего. Например, у строки есть метод split, который позволяет разбивать переменную по указанному параметру (по умолчанию - по пробелу). И, применив этот метод мы получим вместо одной длинной строки массив из слов.
In [2]: test_string.split()
Out[2]: ['Brace', 'yourself,', 'Python', 'is', 'coming']

Теперь можно обратиться к элементам этого массива, чтобы получить отдельные слова. Например:
In [3]: test_string.split()[1]
Out[3]: 'yourself,'

(в Python нумерация элементов массива начинается с 0. Соответственно, если я написал в квадратных скобочках [1], это означает, что я обращаюсь ко второму элементу массива)

Что, если я хочу делить строку по другому разделителю, например по запятой? Да на здоровье!
In [4]: test_string.split(",")
Out[4]: ['Brace yourself', ' Python is coming']
 Тут у читателя может возникнуть резонный вопрос: зачем всё это нужно? Допустим, мы хотим анализировать лог-файл следующим образом:
взять текстовый файл, считать его построчно и вывести время записи и сообщение лога при условии, что вторым блоком в строке было слово ERROR.

Допустим, у нас есть  файл story.txt следующего содержания:
[10/12/2018-15:20] INFO "My mother washed a frame"
[10/12/2018-15:40] ERROR "The frame washed my mother"
[10/12/2018-18:00] INFO "Boris ate a porridge"

Загружаем файл (действие [33]), анализируем и печатаем (действие [34]):
In [33]: with open ("story.txt", "r") as myfile:
    ...:     filecontent = myfile.readlines()
In [34]: for i in filecontent:
    ...:     tmpLine = i.strip().split()
    ...:     if tmpLine[1] =="ERROR":
    ...:         print (tmpLine[0] + " " + " ".join(tmpLine[2:]).strip('"'))
    ...:
[10/12/2018-15:40] The frame washed my mother
Это был довольно примитивный пример, годный только на то, чтобы продемонстрировать принцип работы со строками. Но даже из него можно научиться:
  • открывать файлы
  • печатать избранные части строки
(вот тут-то и станет ясно, кто и впрямь читает текст, а кто просто пролистывает. Потому, что только из моего примера нельзя понять, как печатать избранные части строки, я всё запутал :) Отписываемся в комментах, там и поясню, что здесь происходит).
А вот теперь попробуем вкусняшку ipython. Пишем переменную, точку - и нажимаем на Tab
In [5]: test_string.
  test_string.capitalize   test_string.endswith     test_string.index          
  test_string.casefold     test_string.expandtabs   test_string.isalnum        
  test_string.center       test_string.find         test_string.isalpha      >
  test_string.count        test_string.format       test_string.isdecimal      
  test_string.encode       test_string.format_map   test_string.isdigit   


Ух ты, что это? А это - все методы, которые применимы к строковой переменной. Чтобы узнать, как пользоваться тем, или иным методом, можно добавить вопросительный знак в конце. Например, так:
In [5]: test_string.count?
Docstring:
S.count(sub[, start[, end]]) -> int

Return the number of non-overlapping occurrences of substring sub in
string S[start:end].  Optional arguments start and end are
interpreted as in slice notation.
Type:      builtin_function_or_method
То есть, если у нас есть какая-то строка, то мы уже можем извлечь из неё кучу информации: проверить, есть ли в ней повторяющиеся элементы, проверить, есть ли в ней цифры, или буквы, преобразовать её в заглавные буквы:
In [7]: test_string.upper()
Out[7]: 'BRACE YOURSELF, PYTHON IS COMING'
или в строчные:
In [8]: test_string.lower()
Out[8]: 'brace yourself, python is coming'
(не забываем добавлять () при вызове метода. Пустые скобки означают, что метод вызывается со значениями по умолчанию. Впрочем, попробуйте вызвать его и без скобок, не бойтесь экспериментировать :) )
При этом сама строка не изменяется:
In [9]: print(test_string)
Brace yourself, Python is coming
То есть можно, не изменяя переменной и не ломая ничего вокруг, "пощупать руками" все существующие методы, почитать описание к ним, посмотреть, "что будет, если..." . По-моему, это просто здорово :)

Комментарии

Отправить комментарий

Популярные сообщения из этого блога

iPython для "ручного" тестировщика-2