diff --git a/tests/test_determinist.cpp b/tests/test_determinist.cpp
index eab529463bc35c1e75bc5b4e7f15b6aa4143d07b..52390761eee02430bffab76d00c89ada4fb52574 100644
--- a/tests/test_determinist.cpp
+++ b/tests/test_determinist.cpp
@@ -162,7 +162,7 @@ TEST(DeterministTests, TestMasks)
             evalhyd::evald<xt::xtensor<double, 2>, xt::xtensor<bool, 2>>(obs, prd, metrics);
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(xt::allclose(metrics_masked[m], metrics_subset[m]))
         << "Failure for (" << metrics[m] << ")";
@@ -204,7 +204,7 @@ TEST(DeterministTests, TestMaskingConditions)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
@@ -237,7 +237,7 @@ TEST(DeterministTests, TestMaskingConditions)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
@@ -268,7 +268,7 @@ TEST(DeterministTests, TestMaskingConditions)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
@@ -301,8 +301,8 @@ TEST(DeterministTests, TestMissingData)
     std::vector<xt::xarray<double>> metrics_nan =
             evalhyd::evald<xt::xtensor<double, 2>, xt::xtensor<bool, 2>>(observed, predicted, metrics);
 
-    for (int m = 0; m < metrics.size(); m++) {
-        for (int p = 0; p < predicted.shape(0); p++) {
+    for (std::size_t m = 0; m < metrics.size(); m++) {
+        for (std::size_t p = 0; p < predicted.shape(0); p++) {
             // compute metrics on subset of observations and predictions (i.e.
             // eliminating region with NaN in observations or predictions manually)
             xt::xtensor<double, 1> obs =
@@ -386,7 +386,7 @@ TEST(DeterministTests, TestBootstrap)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
diff --git a/tests/test_probabilist.cpp b/tests/test_probabilist.cpp
index de5f2b452a1b220da8d72513f530baefdbd9d934..c258b0c99061ab41bd00d7c730cb402acfe8ab70 100644
--- a/tests/test_probabilist.cpp
+++ b/tests/test_probabilist.cpp
@@ -173,7 +173,7 @@ TEST(ProbabilistTests, TestMasks)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(xt::allclose(metrics_masked[m], metrics_subset[m]))
         << "Failure for (" << metrics[m] << ")";
@@ -224,7 +224,7 @@ TEST(ProbabilistTests, TestMaskingConditions)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
@@ -263,7 +263,7 @@ TEST(ProbabilistTests, TestMaskingConditions)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
@@ -299,7 +299,7 @@ TEST(ProbabilistTests, TestMaskingConditions)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
@@ -377,7 +377,7 @@ TEST(ProbabilistTests, TestMissingData)
         );
 
     // check that numerical results are identical
-    for (int m = 0; m < metrics.size(); m++) {
+    for (std::size_t m = 0; m < metrics.size(); m++) {
         // for leadtime 1
         EXPECT_TRUE(
                 xt::allclose(
@@ -455,7 +455,7 @@ TEST(ProbabilistTests, TestBootstrap)
             );
 
     // check results are identical
-    for (int m = 0; m < metrics.size(); m++)
+    for (std::size_t m = 0; m < metrics.size(); m++)
     {
         EXPECT_TRUE(
                 xt::allclose(
diff --git a/tests/test_uncertainty.cpp b/tests/test_uncertainty.cpp
index d87a97288213c98b3e38876def1596bb63f5583f..5d5cbb19c5eb40c8304bdd047738a3ad6fa9d2f3 100644
--- a/tests/test_uncertainty.cpp
+++ b/tests/test_uncertainty.cpp
@@ -54,7 +54,7 @@ TEST(UncertaintyTests, TestBootstrapGenerator)
     };
 
     // check that sampled indices are as expected by applying them on some data
-    for (int s = 0; s < samples.size(); s++)
+    for (std::size_t s = 0; s < samples.size(); s++)
     {
         auto data = xt::arange(datetimes.size());
         EXPECT_TRUE(