diff --git a/include/gnss_utils/gnss_utils.h b/include/gnss_utils/gnss_utils.h
index ce4304f2ac277dbf2024fb20a1a18775ab75904c..a16976acdec9a321d0b47fa1f4c647fab896940b 100644
--- a/include/gnss_utils/gnss_utils.h
+++ b/include/gnss_utils/gnss_utils.h
@@ -97,6 +97,7 @@ bool equalArray(const T* array1, const T* array2, const int& size1, const int& s
 }
 bool equalTime(const gtime_t& time1, const gtime_t& time2);
 bool equalObservations(const obsd_t& obs1, const obsd_t& obs2);
+bool equalObservations(const obs_t& obs1, const obs_t& obs2);
 
 }  // namespace GNSSUtils
 
diff --git a/src/gnss_utils.cpp b/src/gnss_utils.cpp
index 6417b51cda0fbbc3aef3535496bed5020f23c4a0..49f9ec44959b2d86f75d37708654742adbdc1ed9 100644
--- a/src/gnss_utils.cpp
+++ b/src/gnss_utils.cpp
@@ -485,4 +485,22 @@ bool equalObservations(const obsd_t& obs1, const obsd_t& obs2)
   return true;
 }
 
+bool equalObservations(const obs_t& obs1, const obs_t& obs2)
+{
+  if (obs1.n != obs2.n)
+    return false;
+  if (obs1.nmax != obs2.nmax)
+    return false;
+  if (obs1.flag != obs2.flag)
+    return false;
+  if (obs1.rcvcount != obs2.rcvcount)
+    return false;
+  if (obs1.tmcount != obs2.tmcount)
+    return false;
+  if (!equalObservations(*(obs1.data), *(obs2.data)))
+    return false;
+
+  return true;
+}
+
 }  // namespace GNSSUtils
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index dcf7deb1c88398bfe18e60e9499ebdfdc152fd58..0b11665962c597a47fc59d32653ad63c8bfddbec 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -14,4 +14,7 @@ include_directories(${GTEST_INCLUDE_DIRS})
 
 # Transformations test
 gnss_utils_add_gtest(gtest_transformations gtest_transformations.cpp)
+gnss_utils_add_gtest(gtest_observations gtest_observations.cpp)
+
 target_link_libraries(gtest_transformations ${PROJECT_NAME})
+target_link_libraries(gtest_observations ${PROJECT_NAME})
diff --git a/test/gtest_navigation.cpp b/test/gtest_navigation.cpp
index 4e4e1db7c0d317720070d5f5d5a56b936646ef24..5170cf11310248899fd967b3b870f974a6368b2f 100644
--- a/test/gtest_navigation.cpp
+++ b/test/gtest_navigation.cpp
@@ -3,7 +3,7 @@
 
 TEST(NavigationTests, Whatever)
 {
-    
+  
 }
 
 int main(int argc, char **argv)
diff --git a/test/gtest_observations.cpp b/test/gtest_observations.cpp
index 80db0f1db9fd9587f4f069a507af885a1c7fb633..66a25f033f294078af970193e274c7817a02d740 100644
--- a/test/gtest_observations.cpp
+++ b/test/gtest_observations.cpp
@@ -1,13 +1,41 @@
 #include "gtest/utils_gtest.h"
 #include "gnss_utils/gnss_utils.h"
+#include "gnss_utils/observations.h"
+
+using namespace GNSSUtils;
 
 TEST(ObservationsTest, LoadFromRinex)
 {
-  
-    
+  gtime_t     t_start{ 0, 0 };  // no limit
+  gtime_t     t_end{ 0, 0 };    // no limit
+  double      dt  = 0.0;        // no limit
+  const char* opt = "-SYS=G";   // only GPS | GPS+GAL: "-SYS=G,L" | ALL: ""
+
+  const std::string& rnx_file = "../src/examples/raw_201805171357.obs";
+  // GNSSUtils utilities
+  Observations observations;
+
+  observations.loadFromRinex(rnx_file.c_str(), t_start, t_end, dt, opt);
+
+  // RTKLIB utilities
+  obs_t obs;
+  obs.data = (obsd_t*)malloc(sizeof(obsd_t) * MAXSAT);
+  obs.n    = 0;
+  obs.nmax = MAXSAT;
+  int stat = readrnxt(rnx_file.c_str(), 1, t_start, t_end, dt, opt, &obs, NULL, NULL);
+
+  ASSERT_EQ(stat, 1);
+
+  // Comparison
+  ASSERT_TRUE(obs.n == observations.getObservations().size());
+
+  for (int ii = 0; ii < obs.n; ++ii)
+  {
+    ASSERT_TRUE(equalObservations(obs.data[ii], observations.getObservations()[ii]));
+  }
 }
 
-int main(int argc, char **argv)
+int main(int argc, char** argv)
 {
   testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();