Upload
sqalab
View
8.034
Download
3
Embed Size (px)
Citation preview
Астахов Левг. Томск, Россия
Инструментация среды исполнения
в арсенале тестировщика
XIX Международная конференция по вопросам качества программного обеспечения
sqadays.com
Что можно улучшить в процессе функционального тестирования
приложений?
Инструментация среды исполнения в арсенале тестировщика
Уменьшение трудозатрат на исправление продукта в случае
падения тестов.
Инструментация среды исполнения в арсенале тестировщика
What?
logger.debug("Entering try block"); try { logger.debug("Printing 'hello world'"); System.out("Hello, World!"); logger.debug("Printed 'hello world'"); } catch (Exception e) { logger.error(e.toString()); } finally (Exception e) { logger.debug("Exiting try block"); }
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщика
Глоссарий:
Инструментация среды исполнения в арсенале тестировщика
Выполнение управляемого кода(Java и .NET программ)
Инструментация среды исполнения в арсенале тестировщика
Режим ядра ОС
JF
Пользовательский режим ОС
Среда исполнения (Java/.NET/… runtime)
Приложение(Java/.NET/…
runtime)
Сторонние библиотеки(Java/.NET/…
runtime)
Неуправляемый код
Инструментация среды исполнения в арсенале тестировщика
Контроль за исполнением кода
Контроль за исполнением кода
Инструментация среды исполнения в арсенале тестировщика
Инструментация среды исполнения в арсенале тестировщика
Контроль за исполнением кода
Инструментация среды исполнения в арсенале тестировщика
Контроль за исполнением кода
Инструментация среды исполнения в арсенале тестировщика
Контроль за исполнением кода
Инструментация среды исполнения в арсенале тестировщика
Контроль за исполнением кода
Уровень среды исполнения
Инструментация среды исполнения в арсенале тестировщика
Среда исполнения JavaОсновная часть логики среды исполнения JavaНаходится в <JAVA_RUNTIME_DIR>/jre/lib/rt.jar
И это самый обычный java архив, ничем не отличающийся от пользовательских приложений.
Более того, начиная с JDK 1.7.0.15, Oracle включает в поставку JDK
Исходный код runtime находится в <JDK_DIR>/src.zip
Чтобы изменить любой класс среды исполнения java, достаточно, внеся изменения в исходный код нужного класса из
<JDK_DIR>/src.zip, скомпилировать его с помощью java и положить
скомпилированный файл класса в <JAVA_RUNTIME_DIR>/jre/lib/rt.jar
Инструментация среды исполнения в арсенале тестировщика
Примеры изменений в среде исполнения
Добавление своего кода в среду исполнения
класс, выполняющий запись и обработку событийjava.lang.InstrumentationHelper
public class InstrumentationHelper { …
public static void Log(String message) { … }public static boolean getInterceptMode() { … }public static void setInterceptMode(boolean mode) { … }public static boolean copyFile(string filePath) { … }…
}
Инструментация среды исполнения в арсенале тестировщика
Изменение существующих классов: взаимодействие с внешней средой
java.io.System – работа с потоками stdin, stdout и stderr, переменными окружения, сборщик мусора, загрузка динамических библиотек
java.io.File – работа с файловой системой java.lang.Runtime – запуск процессовjava.net.java.net.InetAddress – разрешение сетевых имён (DNS)java.lang.ClassLoader – загрузка классовjava.net.HttpURLConnection – веб-сессииjava.lang.Thread – порождение и завершение потоков (threads)
Инструментация среды исполнения в арсенале тестировщика
Примеры изменений в среде исполнения
Изменение существующих классов: java.lang.Runtime
public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException {
return new ProcessBuilder(cmdarray) .environment(envp) .directory(dir) .start(); }
Инструментация среды исполнения в арсенале тестировщика
Примеры изменений в среде исполнения
Изменение существующих классов: java.lang.Runtime
public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException {
InstrumentationHelper.log(String.format("%s %s %s", InstrumentationHelper.StringJoin(cmdarray, ","), InstrumentationHelper.StringJoin(envp, ","), ((dir == null) ? "“ : dir.toString())));
return new ProcessBuilder(cmdarray) .environment(envp) .directory(dir) .start(); }
Инструментация среды исполнения в арсенале тестировщика
Примеры изменений в среде исполнения
Модификация среды исполнения .NETКак и в случае со средой исполнения Java,
основная логика .NET runtime, GAC (Global Assembly Cache) – обычные .NET приложения (DLL - динамические библиотеки), которые модифицируются таким же образом, как и пользовательские.
Большинство сборок GAC находится в C:\Windows\Microsoft.NET\assembly\GAC_MSIL
Платформозависимые сборки находятся в: C:\Windows\Microsoft.NET\assembly\GAC_32\C:\Windows\Microsoft.NET\assembly\GAC_64\
Платформозависимые они потому, что либо там неуправляемый код присутствует, либо эти сборки работают с завязкой на конкретный размер платформозависимых типов данных.
Инструментация среды исполнения в арсенале тестировщика
Поиск нужной сборкиProcess Explorer покажет, какая именно сборка используется целевым приложением
Инструментация среды исполнения в арсенале тестировщика
Модификация среды исполнения .NET
Инструментация среды исполнения в арсенале тестировщика
Модификация на уровне IL assembly (вывод ildasm == вход ilasm)
.method public hidebysig static void WriteLine(string 'value') cil managed noinlining{.permissionset linkcheck = {class 'System.Security.Permissions.HostProtectionAttribute, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' = {property bool 'UI' = bool(true)}}// Размер кода: 12 (0xc).maxstack 8IL_0000: call class System.IO.TextWriter System.Console::get_Out()IL_0005: ldarg.0IL_0006: callvirt instance void System.IO.TextWriter::WriteLine(string)IL_000b: ret} // end of method Console::WriteLine
Инструментация среды исполнения в арсенале тестировщика
Модификация среды исполнения .NET
Инструментация среды исполнения в арсенале тестировщика
Модификация среды исполнения .NET
Инструментация среды исполнения в арсенале тестировщика
Модификация среды исполнения .NET
Инструментация среды исполнения в арсенале тестировщика
Модификация среды исполнения .NET
Инструментация среды исполнения в арсенале тестировщика
Подводные камни
Модификация среды исполнения .NET
За пределами Java и .NET
Python – создается отдельная сборка и скрипты вызываются из него.
Можно настроить посредством virtualenv
Другие технические решения – надо изучать, и находить те, где трудозатраты от изменения
среды исполнения окупятся пользой для разработки, отладки и тестирования .
Инструментация среды исполнения в арсенале тестировщика
ИтогМодификация среды исполнения не решает всех
проблемQA команды, но может занять достойное место среди
инструментов:можно найти много сценариев для применения этого
подхода.
Модификация среды исполнения не является сильно сложным процессом, стенд для функционального
тестирования с модифицированной средой исполнения можно собрать за несколько дней, а пользоваться
постоянно, с минимальной необходимостью поддержки тестового стенда.
Инструментация среды исполнения в арсенале тестировщика
Материалы по теме • Erez Metula, Managed Code Rootkits: Hooking into Runtime
Environmentswww.amazon.com/Managed-Code-Rootkits-Hooking-Environments/dp/1597495743
• Reflexil, The opensource .NET Assembly Editorwww.reflexil.net
• .NET CLR Injection: Modify IL Code during Run-timewww.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time
• Kazuhiro Yamato, Toyo Abe A Runtime Code Modification Method for Application
Programswww.kernel.org/doc/ols/2008/ols2008v2-pages-245-254.pdf
• Dealing with runtime bytecode modificationwww.ibm.com/support/knowledgecenter/api/content/nl/ru/SSYKE2_7.0.0/com.ibm.java.win.70.doc/diag/tools/
shcpd_runtime_bytecode_mod.html
Инструментация среды исполнения в арсенале тестировщика