39
loading...
This website collects cookies to deliver better user experience
// init code
export default function() {
// vu code
}
export let options = {
test_1: {
executor: 'constant-arrival-rate',
rate: 90,
timeUnit: '1m',
duration: '5m',
preAllocatedVUs: 10,
tags: { test_type: 'api' },
env: { API_PROTOCOL: 'http' },
exec: 'api',
},
test_2: {
executor: 'ramping-arrival-rate',
stages: [
{ duration: '30s', target: 600 },
{ duration: '6m30s', target: 200 },
{ duration: '90s', target: 15 },
],
startTime: '90s',
startRate: 15,
timeUnit: '10s',
preAllocatedVUs: 50,
maxVUs: 1000,
tags: { test_type: 'api' },
env: { API_PROTOCOL: 'https' },
exec: 'api',
},
};
dotnet new sln
dotnet new webapi -o Training -f net5.0 --no-https
dotnet sln add Training/Training.csproj
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Product> Products { get; set; }
}
services.AddDbContext<ApplicationDbContext>(opt => opt.UseInMemoryDatabase("ApplicationDbContext"));
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }public static void AddProduct(ApplicationDbContext context, Product product)
{
context.Products.Add(product);
context.SaveChanges();
}
public static Product GetProductById(ApplicationDbContext context, int id)
{
return context.Products.FirstOrDefault((p) => p.Id == id);
}
public static List<Product> GetAllProduct(ApplicationDbContext context)
{
return context.Products.ToList();
}
public static void RemoveProductById(ApplicationDbContext context, int id)
{
var productToRemove = context.Products.FirstOrDefault((p) => p.Id == id);
context.Products.Remove(productToRemove);
context.SaveChanges();
}
}
[ApiController]
[Route("[controller]")]
public class ProductController : ControllerBase
{
private readonly ApplicationDbContext _context;
public ProductController(ApplicationDbContext context)
{
_context = context;
}
[HttpPost]
[Route("AddProduct")]
public void AddProduct(Product product)
{
Product.AddProduct(_context, product);
}
[HttpPost]
[Route("RemoveProduct")]
public void RemoveProduct(int id)
{
Product.RemoveProductById(_context, id);
}
[HttpGet]
[Route("GetAllProducts")]
public IEnumerable<Product> GetAllProducts()
{
return Product.GetAllProduct(_context);
}
[HttpGet]
[Route("GetProduct")]
public Product GetProduct(int id)
{
return Product.GetProductById(_context, id);
}
}
import http from 'k6/http';
import { check } from 'k6';
import { jUnit, textSummary } from 'https://jslib.k6.io/k6-summary/0.0.1/index.js';
export const options = {
stages: [
{ duration: '10s', target: 10 },
{ duration: '20s' },
{ duration: '10s', target: 5},
],
thresholds: {
http_req_duration: ['p(95)<250'],
},
};
export default function () {
let res = http.get(`${__ENV.API_PROTOCOL}://${__ENV.API_BASEURL}/Product/GetAllProducts`);
check(res, {
'is status 200': (r) => r.status === 200,
});
}
export function handleSummary(data) {
let filepath = `./${__ENV.TESTRESULT_FILENAME}-result.xml`;
return {
'stdout': textSummary(data, { indent: ' ', enableColors: true}),
'./loadtest-results.xml': jUnit(data),
}
}