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]:
Вот мы и в "Хопре" :)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']
Out[2]: ['Brace', 'yourself,', 'Python', 'is', 'coming']
Теперь можно обратиться к элементам этого массива, чтобы получить отдельные слова. Например:
In [3]: test_string.split()[1]
Out[3]: 'yourself,'
Out[3]: 'yourself,'
(в Python нумерация элементов массива начинается с 0. Соответственно, если я написал в квадратных скобочках [1], это означает, что я обращаюсь ко второму элементу массива)
Что, если я хочу делить строку по другому разделителю, например по запятой? Да на здоровье!
In [4]: test_string.split(",")
Out[4]: ['Brace yourself', ' Python is coming']
Тут у читателя может возникнуть резонный вопрос: зачем всё это нужно? Допустим, мы хотим анализировать лог-файл следующим образом: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"
[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
Это был довольно примитивный пример, годный только на то, чтобы продемонстрировать принцип работы со строками. Но даже из него можно научиться:
...: 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
- открывать файлы
- печатать избранные части строки
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
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
То есть, если у нас есть какая-то строка, то мы уже можем извлечь из неё кучу информации: проверить, есть ли в ней повторяющиеся элементы, проверить, есть ли в ней цифры, или буквы, преобразовать её в заглавные буквы:
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'
или в строчные:
Out[7]: 'BRACE YOURSELF, PYTHON IS COMING'
In [8]: test_string.lower()
Out[8]: 'brace yourself, python is coming'
(не забываем добавлять () при вызове метода. Пустые скобки означают, что метод вызывается со значениями по умолчанию. Впрочем, попробуйте вызвать его и без скобок, не бойтесь экспериментировать :) )Out[8]: 'brace yourself, python is coming'
При этом сама строка не изменяется:
In [9]: print(test_string)
Brace yourself, Python is coming
То есть можно, не изменяя переменной и не ломая ничего вокруг, "пощупать руками" все существующие методы, почитать описание к ним, посмотреть, "что будет, если..." . По-моему, это просто здорово :)
Brace yourself, Python is coming
Good post!
ОтветитьУдалитьthanks
Удалить