Используйте данный веб-сервис для авторизации в проекте и получения авторизационного ключа, используемого для работы с остальными веб-сервисами Devprom ALM.
Протокол: SOAP, WebService
Ссылка: http://<host>/api/securityservice
WSDL описание (document/literal): http://<host>/api/securityservice?wsdl
WSDL описание (rpc/encoded): http://<host>/api/securityservice?wsdl&style=rpc&use=encoded
Название | Возвращаемое значение | Назначение |
---|---|---|
login (string userName, string userPassword, string projectName) |
Token |
Выполняет авторизацию пользователя в проекте.
Возвращает объект, содержащий авторизационные данные. |
Название | Атрибут | Назначение |
---|---|---|
Token |
Key |
Ключ для авторизации пользователя при выполнении методов веб-сервисов. |
// авторизуемся в проекте
security.SecurityService api = new security.SecurityService() {
Url = 'http://<host>/api/securityservice'
};
security.Token _token = api.login("guest", "guest", "development");
Используйте данный веб-сервис для создания тестовой документации, запуска тестов и отметки результатов выполнения тестов. Использование сервиса доступно после авторизации. Все методы сервиса в качестве первого параметра принимают ключ, полученный после авторизации.
Протокол: SOAP, WebService
Ссылка: http://<host>/api/testservice
WSDL описание (document/literal): http://<host>/api/testservice?wsdl
WSDL описание (rpc/encoded): http://<host>/api/testservice?wsdl&style=rpc&use=encoded
Название | Возвращаемое значение | Назначение |
---|---|---|
Create (string token.Key, TestScenario object) |
TestScenario |
Создание нового раздела тестовой документации, привязанного к корневому узлу тестовой документации. Атрибуты нового раздела передаются в параметре object. Возвращает объект, описывающий созданный тестовый раздел. |
Find (string token.Key, TestScenario object) |
TestScenario |
Загрузка атрибутов раздела тестовой документации по заданным параметрам, определенным в object. Если задать значение object.Id, то метод выполнит поиск по идентификатору тестового раздела. Если указать значение атрибута object.Caption, то - найдет раздел по его названию. Возвращает объект, описывающий искомый тестовый раздел. |
Append (string token.Key, TestScenario parent, TestScenario object) |
TestScenario |
Создает новый подраздел тестовой документации в существующем разделе, идентифицируемом параметром parent. Возвращает объект, описывающий созданный тестовый подраздел. |
Run (string token.Key, TestScenario object, string version, Environment environment) |
TestExecution |
Запускает на тестирование переданный в качестве параметра object тестовый раздел документации. Если у переданного тестового раздела есть дочерние разделы, то в тест будет включать в себя все дочерние разделы. При создании теста можно указать версию тестируемого приложения, а также окружение, на котором осуществляется тестирование. Окружение идентифицируется атрибутов environment.Caption. Необходимо заранее настроить справочник окружений в проекте. Метод возвращает объект, описывающий тест. |
ReportResult(string token.Key, TestExecution execution, TestScenario object, TestExecutionResult result) |
|
Отметка о результате тестирования тестового раздела (object) в составе теста (execution). Результат выполнения идентифицируется атрибутом result.ReferenceName. |
ReportIssue (string token.Key, TestExecution execution, TestScenario object, Request request) |
Request |
Регистрация в проекте ошибки, полученной в результате тестирования раздела (object) в составе теста (execution). Параметры ошибки, например, название, содержание и т.п. задается в атрибутах объекта request. В результате выполнения метода возвращается объект Request, описывающий созданное пожелание. |
ReportFile (string token.Key, TestExecution execution, TestScenario object, Attachment file) |
|
Загрузка в проект файла, связанного с результатами тестирования раздела (object) в составе теста (execution). Вы можете загрузить связанный с результатом снимок экрана, дамп или лог-файл. |
GetResult (string token.Key, TestExecution execution) |
TestExecutionResult |
Возвращает текущий результат выполнения теста в виде объекта TestExecutionResult. |
Название | Атрибут | Назначение |
---|---|---|
TestScenario |
Id |
Идентификатор объекта |
|
Caption |
Название тестового раздела |
|
Content |
Содержание тестового раздела |
|
ParentPage |
Идентификатор родительского тестового раздела |
Environment |
Id |
Идентификатор объекта |
|
Caption |
Название окружения, уникальное значение, используемое для идентификации окружения |
TestExecutionResult |
Id |
Идентификатор объекта |
|
Caption |
Отображаемое название результата |
|
ReferenceName |
Кодовое название результата, уникальное значение, используемое для идентификации типа результата |
Request |
Id |
Идентификатор объекта |
|
Caption |
Название пожелания/ошибки |
|
Description |
Описание пожелания/ошибки |
Attachment |
Id |
Идентификатор объекта |
|
FilePath |
Название файла, которое будет отображаться в проекте |
|
FileExt |
MIME-тип файла |
|
File |
Текстовое поле типа base64binary, содержащее тело файла в кодировке base64 |
// авторизуемся в проекте
security.SecurityService api = new security.SecurityService() {
Url = 'http://<host>/api/securityservice'
};
security.Token _token = api.login("guest", "guest", "development");
// создаем тестовый раздел документации
testing.TestService _api = new testing.TestService() {
Url = 'http://<host>/api/testservice'
};
testing.testscenario root = new testing.testscenario { Caption = "Название 1"};
root = _api.Create(_token.Key, root);
// добавляем дочерний раздел
testing.testscenario child = new testing.testscenario { Caption = "Название 2", Content = "Содержание 2" };
child = _api.Append(_token.Key, root, child);
// запускаем тест на выполнение
testing.testexecution execution =
_api.Run(_token.Key, root, "1.1", new testing.environment { Caption = "Windows XP" } );
// устанавливаем результат тестирования по дочернему разделу
_api.ReportResult(_token.Key, execution, child,
new testing.testexecutionresult { ReferenceName = "failed" });
// регистрируем ошибку
testing.request bug = new testing.request { Caption = "Ошибка в тесте 2" };
bug = _api.ReportIssue(_token.Key, execution, child, bug);
// загружаем файл, например, дамп
string fileName = Environment.GetEnvironmentVariable("windir") + "\\notepad.exe";
FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read);
byte[] fileBytes = new byte[fs.Length];
fs.Read(fileBytes, 0, (int)fs.Length);
fs.Close();
testing.attachment file = testing.attachment
{
FilePath = "notepad.exe",
FileExt = (new FileInfo(fileName)).Extension,
File = fileBytes
};
_api.ReportFile(_token.Key, execution, child, file);
Используйте данный веб-сервис для программного добавления доработок или регистрации ошибок. Использование сервиса доступно после авторизации. Все методы сервиса в качестве первого параметра принимают ключ, полученный после авторизации.
Протокол: SOAP, WebService
Ссылка: http://<host>/api/supportservice
WSDL описание (document/literal): http://<host>/api/supportservice?wsdl
WSDL описание (rpc/encoded): http://<host>/api/supportservice?wsdl&style=rpc&use=encoded
Название | Возвращаемое значение | Назначение |
---|---|---|
RaiseIssue (string token.Key, request issue) |
request |
Создание пожелания с параметрами, заданными в качестве значений атрибутов переменной issue. |
AttachFile (string token.Key, request issue, attachment file) |
attachment |
Прикрепляет файл к пожеланию, идентифицируемому полем issue.Id. Атрибуты файла, равно как и тело файла содержится в значениях переменной file. |
Название | Атрибут | Назначение |
---|---|---|
Request |
Id |
Идентификатор объекта |
|
Caption |
Название пожелания/ошибки |
|
Description |
Описание пожелания/ошибки |
Attachment |
Id |
Идентификатор объекта |
|
FilePath |
Название файла, которое будет отображаться в проекте |
|
FileExt |
MIME-тип файла |
|
File |
Текстовое поле типа base64binary, содержащее тело файла в кодировке base64 |
// авторизуемся в проекте
security.SecurityService api = new security.SecurityService() {
Url = 'http://<host>/api/securityservice'
};
support.SupportService _supportService = new support.SupportService() {
Url = 'http://<host>/api/securityservice'
};
security.Token _token = api.login("guest", "guest", "development");
var issue = new support.request() {
Caption = "Краткое описание ошибки",
Description = "Подробное описание ошибки"
};
issue = _supportService.RaiseIssue(_token.Key, issue);
// загружаем файл, например, дамп
string fileName = Environment.GetEnvironmentVariable("windir") + "\\notepad.exe";
FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read);
byte[] fileBytes = new byte[fs.Length];
fs.Read(fileBytes, 0, (int)fs.Length);
fs.Close();
support.attachment file = support.attachment
{
FilePath = "notepad.exe",
FileExt = (new FileInfo(fileName)).Extension,
File = fileBytes
};
_supportService.AttachFile(_token.Key, issue, file);
Используйте данный веб-сервис для программного доступа к данным, хранящимся в Devprom ALM, например, с целью интеграции с другими инструментами, используемыми в работе. Все методы сервиса в качестве первого параметра принимают ключ, полученный после авторизации.
Протокол: SOAP, WebService
Ссылка: http://<host>/api/dataservice
WSDL описание (rpc/encoded): http://<host>/api/dataservice?wsdl
WSDL описание (document/literal): http://<host>/api/dataservice?wsdl&style=document&use=literal
Название | Возвращаемое значение | Назначение |
---|---|---|
<класс>RemoteAdd (string token.Key, <класс> object) |
<класс> |
Создание экземпляра <класс> с атрибутами по умолчанию, заданными в переменной object. Возвращает созданный экземпляр с заполненными полями Id и т.п. |
<класс>RemoteAddBatch(string token.Key, <класс>[] objects) |
<класс> |
Создание экземпляров <класс> из вектора. Возвращает вектор созданных экземпляров с заполненными полями Id и т.п. |
<класс>RemoteLoad (string token.Key, string id) |
<класс> |
Возвращает экземпляр <класс> загруженный по идентификатору id. |
<класс>RemoteStore (string token.Key, string id, <класс> object) |
|
Сохраняет атрибуты экземпляра <класс> идентифицируемого по id. |
<класс>RemoteStoreBatch(string token.Key, <класс>[] objects) |
|
Сохраняет атрибуты экземпляров типа <класс>, идентифицируемых значениями атрибутов Id. |
<класс>RemoteDelete(string token.Key, string id) |
|
Удаляет экземпляр <класс> идентифицируемый по id. |
<класс>RemoteDeleteBatch(string token.Key, <класс>[] objects) |
|
Удаляет экземпляры типа <класс>, идентифицируемых значениями атрибутов Id. |
<класс>RemoteGetAll(string token.Key) |
<класс>[] |
Возвращает все сохраненные экземпляры <класс> в виде массива объектов. |
<класс>RemoteFind (string token.Key, <класс> object) |
<класс>[] |
Выполняет поиск объектов по точному совпадению значений атрибутов object. Например, для поиска по названию, необходимо задать значение атрибута object.Caption и т.д. В результате возвращается массив экземпляров <класс>, удовлетворяющих критериям поиска |
Название | Атрибут | Назначение |
---|---|---|
task |
Id |
Идентификатор объекта |
|
Caption |
Заголовок задачи |
|
Priority |
Идентификатор приоритета (ссылка на priority) |
|
TaskType |
Идентификатор типа задачи (ссылка на tasktype) |
|
Release |
Идентификатор итерации (спринта), в которую включена задачи (ссылка на iteration) |
|
State |
Текстовое значение текущего состояния задачи, например, submitted или resolved |
|
Assignee |
Идентификатор исполнителя (ссылка на paticipant) |
|
ChangeRequest |
Идентификатор исходного пожелания (ссылка на request) |
|
Planned |
Плановая трудоемкость по задаче в часах |
|
LeftWork |
Оставшаяся трудоемкость по задаче в часах |
|
Fact |
Фактически затраченное время на задачу в часах |
|
Comments |
Комментарий к задаче |
|
RecordCreated |
Дата и время создания задачи |
|
RecordModified |
Дата и время последней модификации задачи |
|
Result |
Текстовое значение результата выполнения задачи |
priority |
Id |
Идентификатор объекта |
|
Caption |
Отображаемое название приоритета |
tasktype |
Id |
Идентификатор объекта |
|
Caption |
Отображаемое название типа задачи |
|
ReferenceName |
Кодовое имя типа задачи, например, testdesign |
iteration |
Id |
Идентификатор объекта |
|
ReleaseNumber |
Отображаемое название итерации |
|
StartDate |
Дата начала итерации |
|
StartDate |
Дата окончания итерации |
|
IsActual |
Признак актуальности итерации, "N" - итерация устарела |
|
InitialVelocity |
Начальная скорость команды для данной итерации |
|
RecordCreated |
Дата и время создания итерации |
|
RecordModified |
Дата и время последней модификации итерации |
participant |
Id |
Идентификатор объекта |
|
Caption |
Отображаемое имя участника проекта |
|
|
Адрес электронной почты участника (readonly) |
|
Login |
Системное имя участника (readonly) |
|
SystemUser |
Идентификатор пользователя в системе (ссылка на user) |
request |
Id |
Идентификатор объекта |
|
Caption |
Отображаемое имя пожелания (или истории пользователя) |
requirement |
Id |
Идентификатор объекта |
|
Caption |
Отображаемое имя раздела требования |
|
ParentPage |
Ссылка на объект типа requirement, являющийся родительской страницей |
|
PageType |
Ссылка на объект типа wikipagetype, определяющий тип раздела требований |
|
Content |
Содержимое раздела требований |
// авторизуемся в проекте
security.SecurityService api = new security.SecurityService() {
Url = 'http://<host>/api/securityservice'
};
data.DataService _dataService = new data.DataService() {
Url = 'http://<host>/api/dataservice'
};
security.Token _token = api.login("guest", "guest", "development");
data.participant[] participants = _dataService.participantRemoteFind(
_token.Key, new data.participant() { Caption = "Ivan Ivanovich" } );
Данный пример описывает использование DataService - низкоуровневого сервиса Devprom SOAP API, позволяющего выполнять любые действия над данными в Devprom, которые разрешены правами доступа текущего пользователя.
Devprom SOAP API по-умолчанию доступен в любой поставке Devprom, независимо от ее редакции. Перечень поддерживаемых сервисов доступен в документации программных интерфейсов.
Пример предназначен для того, чтобы сформировать у вас базовое понимание принципов использования Devprom SOAP API. В формате теста (C#, nUnit) мы создадим нового пользователя в Devprom с заданным атрибутами и проверим, что этот пользователь может войти в систему.
using DEVPROM.WebTest.Core;
using NUnit.Framework;
using DEVPROM.WebTest.devprom.api.security;
using DEVPROM.WebTest.devprom.api.model;
namespace DEVPROM.WebTest.Api
{
[TestFixture]
public class ApiUser
{
[Test]
public void TestCreateUser()
{
// login under administrator
var securityService = new SecurityService() { Url = TestUtils.GetAppConfigurationItem("HostUrl") + "/api/securityservice" };
var token = securityService.login(TestHelper.appUserName, TestHelper.appUserPassword, null);
// low-level API data service
var dataService = new DataService() { Url = TestUtils.GetAppConfigurationItem("HostUrl") + "/api/dataservice" };
// create new user
var testUser = new user()
{
Caption = "Api Test User",
Description = "",
Email = "apitestuser@devprom.ru",
IsAdmin = "N", // Y or N
Login = "ApiUser",
Skype = "api_test",
Phone = "+7910xxxxxxx",
Password = "testpass"
};
var createdUser = dataService.userRemoteAdd(token.Key, testUser);
// assert user created
Assert.IsNotNull(createdUser.Id); // now we have user ID
Assert.AreEqual(testUser.Caption, createdUser.Caption);
Assert.AreEqual(testUser.Email, createdUser.Email);
// assert user can login
token = securityService.login(testUser.Login, testUser.Password, null);
Assert.IsNotNullOrEmpty(token.Key, "Can't login under new user");
}
}
}
Пространства имен (namespaces) DEVPROM.WebTest.devprom.api.security и DEVPROM.WebTest.devprom.api.model были автоматически созданы на основе WSDL http://localhost/api/securityservice?wsdl и http://localhost/api/dataservice?wsdl соответственно (Visual Studio - Project - Add Web Reference).
Создание нового пользователя:
<?php
$security = new SoapClient(
'https://demo.myalm.ru/api/securityservice?wsdl',
array(
'soap_version'=>SOAP_1_1,
'cache_wsdl' => WSDL_CACHE_NONE,
'trace'=>true
)
);
$result = $security->login(
array(
'username' => '***',
'userpass' => '***',
'project' => '')
);
$token = $result->return;
$data = new SoapClient(
'https://demo.myalm.ru/api/dataservice?wsdl',
array(
'soap_version'=>SOAP_1_1,
'cache_wsdl' => WSDL_CACHE_NONE,
'trace'=>true
)
);
$user = $data->__soapCall('user.RemoteAdd',
array (
'token' => $token->Key,
'parms' => array (
'Caption' => 'New user',
'Password' => 'test',
'AskChangePassword' => 'Y',
'Language' => 1,
'Email' => '',
'Login' => '',
'Description' => '',
'Phone' => '',
'Photo' => '',
'PhotoExt' => '',
'PhotoPath' => '',
'NotificationTrackingType' => '',
'NotificationEmailType' => '',
'OrderNum' => '',
'RecordCreated' => '',
'RecordModified' => '',
'Id' => '',
'GroupId' => '',
'ClassName' => '',
'RecordVersion' => '',
'Url' => ''
)
)
);
echo $user->Id;
Создание заявки и изменение ее статуса:
<?php
$security = new SoapClient(
'https://demo.myalm.ru/api/securityservice?wsdl',
array(
'soap_version'=>SOAP_1_1,
'cache_wsdl' => WSDL_CACHE_NONE,
'trace'=>true
)
);
$result = $security->login(
array(
'username' => '*****',
'userpass' => '****',
'project' => '****')
);
$token = $result->return;
$data = new SoapClient(
'https://demo.myalm.ru/api/dataservice?wsdl',
array(
'soap_version'=>SOAP_1_1,
'cache_wsdl' => WSDL_CACHE_NONE,
'trace'=>true
)
);
$request = $data->__soapCall('request.RemoteAdd',
array (
'token' => $token->Key,
'parms' => array (
'Caption' => 'New request',
'Description' => 'test',
'Environment' => '',
'Priority' => '',
'Estimation' => '',
'State' => 'submitted',
'Type' => '',
'Function' => '',
'Author' => '',
'Owner' => '',
'Project' => '',
'SubmittedVersion' => '',
'ClosedInVersion' => '',
'PlannedRelease' => '',
'LifecycleDuration' => '',
'StartDate' => '',
'FinishDate' => '',
'DeliveryDate' => '',
'Fact' => '',
'FactTasks' => '',
'OrderNum' => '',
'RecordCreated' => '',
'RecordModified' => '',
'RecordVersion' => '',
'Attachment' => '',
'Tags' => '',
'Links' => '',
'ProjectPage' => '',
'Question' => '',
'DueWeeks' => '',
'Watchers' => '',
'Id' => '',
'ClassName' => '',
'Url' => ''
)
)
);
echo $request->Id;
$request->State = 'planned';
$request = $data->__soapCall('request.RemoteStore',
array (
'token' => $token->Key,
'id' => $request->Id,
'parms' => $request
)
);
Для использования SOAP API при интеграции с продуктами 1C необходимо указать альтернативный разделитель между названием сущности (класса) и его методами. Для этого в адресную строку необходимо добавить параметр delim=_ например:
https://<serverName>/api/dataservice?wsdl&style=document&use=literal&delim=_
Тогда все методы примут следующий вид: