- Android Keystore Manager
- Creating a new keystore
- Choosing your keystore location
- Loading an existing keystore within the Keystore Manager
- Adding a new key to an existing keystore
- 10 ноября 2016 г. Простые Unit-тесты в Android
- Общие сведения
- Настройка
- Local-тесты в Android
- Instrumented тесты в Android
- Заключение
Android Keystore Manager
The Keystore Manager is a window which allows you to create, configure or load Android keystores An Android system that lets you store cryptographic key entries for enhanced device security. More info
See in Glossary and keys. For further information see Android’s Keys, Certificates and Keystores documentation.
To open the Keystore Manager, open the Android publishing window and select the Keystore Manager button.
Keystore Manager Window
Property | Description |
---|---|
Keystore dropdown | Use the Keystore dropdown to create a new keystore or select an existing one. Select Create New to create a new keystore. Select Anywhere to save the keystore file in your Project folder, or In Dedicated Location to create and save it to a different directory. Select Select Existing > Browse to select a keystore you already have. See Choosing your keystore location for more details. |
Password | Enter your keystore password. If you are creating a new keystore, use this field to create a password. |
Confirm Password (only required when you create a new keystore) | Use this to confirm the password for your new keystore. |
Existing keys | The Keystore Manager window automatically populates the Existing Keys field when you load an existing keystore into your project. |
New Key Values | If you have created a new key, you need to complete these fields. If you have loaded existing keys, you do not need to complete these fields. The New Key Values fields request the same information that Android Studio requests when you generate a key or keystore. This information is not displayed in your app, but is included in your certificate as part of the Android Package (APK). For further information, see Android’s Generate an upload key and keystore documentation. Unity does not validate this information. If you leave these fields blank, Unity uses empty values. This might affect the validity of your key. |
Alias | Enter an identifying name for your key. |
Password | Choose and enter a password for your key. |
Confirm password | Enter the password for your key again. |
Validity (years) | Enter an amount of time (in years) that your key is valid for. This should exceed the amount of time you expect to manage your application for, so that you can use the same key to sign application updates. The default validity is 25 years. |
First and Last Name | Enter your first and last name. |
Organizational Unit | Enter your organizational unit. Organizational units are the different divisions within an organization. For example: Android development team. |
Organization | Enter the organization that manages your application. For example: your company name. |
City or Locality | Enter your city or locality. |
State or Province | Enter your state or province. |
Country Code | Enter your country code. |
Note: You cannot change this keystore, key or certificate information once you sign your Android app.
Creating a new keystore
Use the Keystore dropdown to create a new keystore.
- From inside the dropdown, click Create New.
- Select Anywhere or In Dedicated Location.
- Enter a password in Keystore password.
- Re-enter the password in Confirm password.
Creating a new keystore automatically creates a new key. Fill in the New Key fields in the keystore manager.
Choosing your keystore location
When you create a new keystore, the storage location you choose changes the default location that Unity opens your file explorer in to save your file. You can still change this after the file explorer opens. — Choose Anywhere to open the file explorer. By default, Unity stores your keystore inside your project folder. However, you can store this anywhere on your machine. If you store your keystore outside of your project folder, Unity saves an absolute path. — Choose In Dedicated Location to open the file explorer in a custom default location. By default, this path points to $HOME/ on MacOS and to %USER_HOME%\ on Windows.
To define a new project-wide dedicated location, go to Unity > Preferences > External Tools > Android > Keystores Dedicated Location, then click Browse to select a location or enter a path in the text box.
If you store a keystore to a dedicated location, Unity saves a relative path. This relative path is equal to the dedicated location paths on other machines. Therefore, the folders don’t need to be in the same place on both machines.
Note that if you save the new keystore outside of your project folder or a shared directory, collaborators on your project might not have access to it.
Loading an existing keystore within the Keystore Manager
Use the Keystore dropdown to load an existing keystore.
- Select Select Existing.
- Select Browse to load a keystore from your file system, or select a keystore stored in a Dedicated Location from below the partition.
- Enter the password in Keystore password.
- Select Load Keys.
If you have multiple keys in your keystore, select a key for your project in the Android Publishing Settings Project Key fields.
Note: You can also choose an existing keystore directly from the Android Publishing Settings, without using the Keystore Manager window.
Adding a new key to an existing keystore
Use the following steps to store multiple keys in a keystore.
- Load an existing keystore (see Loading an existing keystore within the Keystore Manager).
- Fill in the New Key Values.
- Select Add Key. A Key and Keystore Created dialogue window appears.
- Select the new key as your project key.
Источник
10 ноября 2016 г. Простые Unit-тесты в Android
Вот и настало время разобраться и написать небольшую заметку о том, что из себя представляет тестирование логики Android-приложений. К этому вопросу я пришел не сразу, однако учиться никогда не поздно!
Общие сведения
Для начала определимся, что такое тесты и зачем их нужно писать. Из Wikipedia:
Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
Другими словами, тесты — это методы, которые проверяют работоспособность нашего кода. Но каким образом это делается? Давайте по порядку. Тест считается выполненным, если он выполнился без ошибок. А для разного рода проверок используются вспомогательные методы вроде «семейства» методов assertXXX (см. примеры ниже).
Unit-тестирование в Android можно разделить на 2 типа:
- Локальные unit-тесты (Local unit tests) — тесты, для выполнения которых используется только JVM. Они предназначены для тестирования бизнес-логики, которая не взаимодействует с операционной системой.
- Инструментальные unit-тесты (Instrumented unit tests) — тесты, с помощью которых тестируется логика, «завязанная» на Android API. Их выполнение происходит на физическом девайсе/эмуляторе, что занимает значительно больше времени, чем локальные тесты.
Выбор одного из этих 2 типов зависит от целей тестируемой логики. Естественно, если это возможно, лучше писать локальные тесты.
Также при создании тестов стоит уделить внимание организации пакетов. Существует следующая структура, которой стоит придерживаться:
- app/src/main/java — исходный код приложения;
- app/src/test/java — здесь размещаются локальные тесты;
- app/src/androidTest/java — сюда помещаем инструментальные тесты.
Настройка
Если вы почему-то не используете Android Studio, которая генерирует пакеты при создании проектов, стоит запомнить структуру выше. К тому же, IDE конфигурирует Gradle-файл модуля app:
Для упрощения написания тестов огромной популярностью пользуется фреймворк Mockito. В его возможности входит имитация и наблюдение объектов, а также вспомогательные средства проверок. Чтобы начать его использовать, добавим зависимость:
Local-тесты в Android
Теперь давайте рассмотрим 2 простейших теста, которые проверяют на соответствия 2 объекта (в нашем случае — числа):
Для этого создадим в пакете для локальных тестов класс и разместим в нем наши методы. Чтобы JUnit знал, что эти методы являются тестами, они помечаются соответствующей аннотацией @Test . Метод же assertEquals() кидает ошибку AssertionError в случае, если первый (ожидаемый) и второй (результат) не соответствуют друг другу.
Давайте запустим их (нажав правой кнопкой на класс и выбрав Run ‘ExampleUnitTest’ в появившемся меню) и посмотрим на результат выполнения:
Видно, что первый метод выполнился, а во втором произошла ошибка, т.к. 5 != (2 + 2). Также можно настроить тест на ожидаемое исключение используя параметр expected :
В таком случае тест выполнится, т.к. это исключение мы ожидали. Для длинных операций можно также указать параметр timeout и установить значение в миллисекундах. Если метод не выполнится в течение заданного времени, тест будет считаться проваленным:
Есть еще такой хитрый механизм как Matchers. К примеру, их на вход принимает метод assertThat(T actual, Matcher matcher) и возвращают методы класса org.hamcrest.CoreMatchers . Матчеры представляют собой логические операции совпадения. Рассмотрим несколько из них:
Как видно из названий, is() можно описать как оператор «равно», is(not()) как «неравно», а hasItem() — как проверку на наличие элемента в списке. И читается это как связное предложение. Здесь можно найти весь перечень матчеров.
Пока мы видели несложные примеры, на основании которых уже можно писать простые тесты. Но я бы хотел рассмотреть библиотеку Mockito, с чьей помощью наши тесты станут по-настоящему крутыми!
Как упоминалось выше, Mockito используется для создания «заглушек». Они называются mock-объектами. Их цель — заменить собой сложные объекты, которые не нужно/невозможно тестировать. Объявить их можно двумя способами:
Обратите внимание, что для того, чтобы использовать аннотацию @Mock , класс нужно пометить аннотацией @RunWith(MockitoJUnitRunner.class) или вызвать MockitoAnnotations.initMocks(this); в @Before -методе:
Получив «замоканный» объект, можно творить настоящие чудеса! К примеру, для того, чтобы «переопределить» название приложения из строкового ресурса, можно сделать следующее:
Теперь при вызове метода getString() будет возвращаться «Fake string», даже если он вызван неявно (за пределами теста):
Но что если мы хотим переопределить все строковые ресурсы? Неужели нам придется прописывать эту конструкцию для каждого из них? Естественно, нет. Для этого предусмотрены методы anyXXX() , (anyInt() , anyString() , etc. Теперь, если заменить R.string.app_name на anyInt() (не забываем, что в Android все ресурсы имеют тип Integer) — все строки будут заменены на нашу строку.
А убедиться в этом мы можем, дописав assertThat() в конце нашего теста:
В случае, когда мы хотим выбросить Exception, можно использовать конструкцию when(. ).thenThrow(. ); .
Есть еще магический метод verify() который провалит тест в случае, если указанный метод не был до этого вызван. Взглянем на код:
Работает это так: мы передаем в verify(mockedList) наш мок-лист, после чего указываем, какие именно методы нас интересуют. В данном случае добавление строки и очистка списка. Неотъемлемый инструмент, как по мне 🙂
Но по-настоящему потенциал этого метода раскрывается при использовании spy-объектов. Их главное отличие в том, что они не создаются напрямую, в отличие от mock’ов. А толку-то с них, спросите вы? А толк в том, что создав «шпиона» вы можете следить за ним также, как и за фейковым объектом:
Instrumented тесты в Android
При помощи этого типа тестов мы получаем доступ к реальному контексту, а также ко всем возможностям Android API. Помимо этого, у нас есть «режим Бога», при помощи которого мы можем управлять жизненным циклом активности. Для того, чтобы тест распознавался как инструментальный, нам нужно пометить класс соответствующей аннотацией:
Сами же тесты мы помечаем так же, как и в случае локальных — при помощи аннотации @Test . Давайте проверим, соответствует ли пакет нашего контекста нашему приложению:
С помощью имеющегося инструментария можно прослушивать состояние активностей:
. или и вовсе управлять их состоянием:
Заключение
Это, пожалуй, самые важные вещи, которые мне удалось найти при первом знакомстве. Поэтому не закидывайте камнями, как говорится 🙂 Но, я думаю, для начала этого будет достаточно. Для тех, кто хочет узнать больше о возможностях junit, рекомендую почитать официальную документацию, а вот материал про возможности инструментальных тестов.
Источник